[FIX] sectorBenchmark: dedup pool via subquery correlata (finding review, fix reale)

Il commit precedente NON conteneva questo fix (Edit fallito su ancora errata). Ora applicato:
JOIN su MAX(completed_at) -> subquery correlata (ultimo completato, tie-break id, LIMIT 1),
una sola riga per org anche con timestamp identici. E2E: org con 2 assessment stesso TS -> peers=4 (non 5).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile 2026-05-30 12:19:35 +02:00
parent 897a5a4339
commit 3ed71ebb7a

View File

@ -175,16 +175,20 @@ class DashboardController extends BaseController
);
$myScore = $mine ? (float) $mine['overall_score'] : null;
// Esattamente UN punteggio per org (ultimo completato, tie-break su id): la subquery
// correlata evita il duplicato che il JOIN su MAX(completed_at) produceva quando due
// assessment della stessa org condividono identico timestamp.
$rows = Database::fetchAll(
"SELECT a.overall_score
FROM assessments a
JOIN (
SELECT organization_id, MAX(completed_at) mx
FROM assessments WHERE status='completed'
GROUP BY organization_id
) last ON last.organization_id = a.organization_id AND last.mx = a.completed_at
JOIN organizations o ON o.id = a.organization_id
WHERE o.is_active = 1 AND o.sector = ? AND a.status='completed' AND a.overall_score IS NOT NULL",
WHERE o.is_active = 1 AND o.sector = ? AND a.status='completed' AND a.overall_score IS NOT NULL
AND a.id = (
SELECT a2.id FROM assessments a2
WHERE a2.organization_id = a.organization_id
AND a2.status='completed' AND a2.overall_score IS NOT NULL
ORDER BY a2.completed_at DESC, a2.id DESC LIMIT 1
)",
[$sector]
);
$scores = array_map(fn($r) => (float) $r['overall_score'], $rows);