首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle SQL 多條件分組查詢去重取最大值實戰

     編輯:程式設計綜合問答

問題場景

需要從多張關聯表(jobreply、job、jobreplycharacter)中查詢數據,並按 jobid 和 charactervalue 分組,但在多條數據下無法通過 rownum=1 正確獲取每組第一條記錄,且存在重複字段問題。

原始 SQL

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 會先分組後取行號,導致跨組行號錯亂;分析函數在分組內獨立計算行號,邏輯更清晰可靠。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved