總會碰到一些奇奇怪怪的需求,各種加字段阿、建視圖阿等等,然后使用了group by 還是沒有達到想要的結果,那咋辦嘛。
0.需求背景
根據MLOT重復字段 取 TRANSACTIONTIME 最小時間的一列, (MLOT已經用過group by分組 order by排序)
所以我們可以用(ROWNUM)偽列函數 + (MAX)取最大值函數 || (MIN)取最小值函數配合 再次使用group by 分組
1.首先把問題表加上偽列(rownum)--記得根據你要分組的列排序一下
--表記得改你自己的-- 請參考 select rownum rn,a.* from 你的表 a /* Formatted on 2020/4/12 9:37:03 (QP5 v5.256.13226.35538) */ SELECT ROWNUM RN, a.* FROM ( SELECT * FROM epidm.B_DM_MMS_PVD_INOUT WHERE MLOT IN ('P3DAR1931509', 'P3DAR1931510', 'P3DAR1931601', 'P3DAR1931602', 'P3DAR1931610', 'P3DAR1931611') ORDER BY MLOT) a
2.然后再根據用過偽列的sql當作一張表進行子查詢
-- 子查詢且分組 當然你也可以再GROUP BY MLOT 前面進行 where 篩選 /* Formatted on 2020/4/12 9:34:48 (QP5 v5.256.13226.35538) */ SELECT * FROM (SELECT ROWNUM rn, a.* FROM ( SELECT * FROM epidm.B_DM_MMS_PVD_INOUT WHERE MLOT IN ('P3DAR1931509', 'P3DAR1931510', 'P3DAR1931601', 'P3DAR1931602', 'P3DAR1931610', 'P3DAR1931611') ORDER BY MLOT) a) B WHERE rn IN ( SELECT MIN (rn) FROM (SELECT ROWNUM rn, a.* FROM ( SELECT * FROM epidm.B_DM_MMS_PVD_INOUT WHERE MLOT IN ('P3DAR1931509', 'P3DAR1931510', 'P3DAR1931601', 'P3DAR1931602', 'P3DAR1931610', 'P3DAR1931611') ORDER BY MLOT) a) B GROUP BY MLOT)
W.參考模板
/* Formatted on 2020/4/12 9:46:14 (QP5 v5.256.13226.35538) */ SELECT * FROM 你的表 WHERE 偽列名稱 IN ( SELECT MAX (偽列名稱) FROM 你的表 GROUP BY 你要分組的列) --也可以進行where 篩選
--首先table 表要有rownum偽列函數 並取個名稱 這里我取的是rn select * from table where rn in (select Max(rn) from table group by mlot)