[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; $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( $rows = Database::fetchAll(
"SELECT a.overall_score "SELECT a.overall_score
FROM assessments a 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 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] [$sector]
); );
$scores = array_map(fn($r) => (float) $r['overall_score'], $rows); $scores = array_map(fn($r) => (float) $r['overall_score'], $rows);