【一】問題描述
(1)問題描述
有時候我們需要對數(shù)據(jù)進行去重處理,例如查詢結(jié)果里的文件名有重復(fù),我們希望可以按照創(chuàng)建時間排序,最終結(jié)果里每個文件名只取創(chuàng)建時間最近的一個。
(2)有哪些問題
想到去重,可以想到使用distinct或者group by分組。但是這兩者有個問題,例如我們查詢結(jié)果中包含多個目標(biāo)字段【文件id,文件名,文件所屬項目,文件創(chuàng)建時間,文件類型】等等。
distinct是對組合進行去重,必須加在select中和所有目標(biāo)字段之前,也就是只有當(dāng)上面的5個字段都重復(fù)了,這條數(shù)據(jù)才算是重復(fù)。
group by也是要求select中的字段必須出現(xiàn)在group by中,同樣是上面的5個字段都重復(fù)了,這條數(shù)據(jù)才算是重復(fù)。
而我們的目標(biāo)是只根據(jù)【文件名】進行分組,在分組中根據(jù)文件創(chuàng)建時間進行排序,然后每組中只選取創(chuàng)建時間最近的那條數(shù)據(jù),且這條數(shù)據(jù)是完整的包含上面5個字段。
(3)為什么不在業(yè)務(wù)代碼里進行過濾處理?
因為還有分頁查詢的功能,所以查詢的工作就必須得在sql里實現(xiàn)(就當(dāng)學(xué)習(xí)sql了)
【二】解決方案(oracle和mysql都可用)
(1)當(dāng)前sql
SELECT
T.ID,
R.TASK_ID,
T.CRT_DT_TM,
'RST_TABLE' AS TYPE,
T.FULL_NM AS NAME
FROM
period_script_x_rst_table T
JOIN period_script_revision R ON R.ID = T.PERIOD_SCRIPT_REV_ID
JOIN period_script_info S ON S.ID = R.PERIOD_SCRIPT_ID
WHERE
S.MASTER_REV_ID = T.PERIOD_SCRIPT_REV_ID
查詢結(jié)果
可以看到NAME有很多重復(fù)的,我們只想取到時間最近的那一條,同時還不能用group by進行分組
(2)加上分組語句和組內(nèi)排序
SELECT
T.ID,
R.TASK_ID,
'RST_TABLE' AS TYPE,
T.FULL_NM AS NAME,
rank () over ( partition BY T.FULL_NM ORDER BY T.CRT_DT_TM DESC ) rankNo
FROM
period_script_x_rst_table T
JOIN period_script_revision R ON R.ID = T.PERIOD_SCRIPT_REV_ID
JOIN period_script_info S ON S.ID = R.PERIOD_SCRIPT_ID
WHERE
S.MASTER_REV_ID = T.PERIOD_SCRIPT_REV_ID
查詢結(jié)果
可以看到結(jié)果是根據(jù)NAME進行了分組,并且進行了組內(nèi)排序,最后給每條數(shù)據(jù)加了一個組內(nèi)排序序號。
(3)加上條件過濾實現(xiàn)組內(nèi)取第一條目標(biāo)數(shù)據(jù)
SELECT
*
FROM
(
SELECT
T.ID,
R.TASK_ID,
T.CRT_DT_TM,
'RST_TABLE' AS TYPE,
T.FULL_NM AS NAME,
rank () over ( partition BY T.FULL_NM ORDER BY T.CRT_DT_TM DESC ) rankNo
FROM
period_script_x_rst_table T
JOIN period_script_revision R ON R.ID = T.PERIOD_SCRIPT_REV_ID
JOIN period_script_info S ON S.ID = R.PERIOD_SCRIPT_ID
WHERE
S.MASTER_REV_ID = T.PERIOD_SCRIPT_REV_ID
) e
WHERE
e.rankNo = 1
查詢結(jié)果
可以看到,根據(jù)組內(nèi)排序序號rankNo=1來過濾,就實現(xiàn)了去重的效果文章來源:http://www.zghlxwxcb.cn/news/detail-570810.html
【三】總結(jié)
如果想要實現(xiàn)去重,而distinct和group by都無法滿足需求,就可以考慮試試這個方案文章來源地址http://www.zghlxwxcb.cn/news/detail-570810.html
rank() over(partition by e.commandid order by e.systemid desc) rankNo (
partition by 根據(jù)什么進行分組,
order by 根據(jù)什么進行排序,
rank() over() 進行排名
rankNo 別名
)
到了這里,關(guān)于【Sql】根據(jù)字段分組排序,取其第一條數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!