需要從多張關聯表(jobreply、job、jobreplycharacter)中查詢數據,並按 jobid 和 charactervalue 分組,但在多條數據下無法通過 rownum=1 正確獲取每組第一條記錄,且存在重複字段問題。
select max(t.jobreplyid), t.jobid, yy.charactervalue
from jobreply t, job j, jobreplycharacter yy
where t.jobid = j.jobid
and t.jobreplyid = yy.jobreplyid
and j.jobid = 11844
and yy.jobspeccharacterid = 7695
group by t.jobid, yy.charactervalue
使用分析函數 ROW_NUMBER() 配合分區排序,精確提取每組首條記錄:
SELECT jobreplyid, jobid, charactervalue FROM (
SELECT t.jobreplyid, t.jobid, yy.charactervalue,
ROW_NUMBER() OVER (PARTITION BY t.jobid, yy.charactervalue ORDER BY t.jobreplyid DESC) rn
FROM jobreply t
JOIN job j ON t.jobid = j.jobid
JOIN jobreplycharacter yy ON t.jobreplyid = yy.jobreplyid
WHERE j.jobid IN (11844, 11843)
AND yy.jobspeccharacterid = 7695
) WHERE rn = 1;
PARTITION BY 實現多字段分組ORDER BY 確定組內排序規則(此處按 ID 降序取最新)rn = 1 保證每組僅取一條傳統 GROUP BY + ROWNUM 會先分組後取行號,導致跨組行號錯亂;分析函數在分組內獨立計算行號,邏輯更清晰可靠。