如何获取基于MRLNum的最新及上一日期记录
需求实现:按
MRLNum筛选每组最新及上一日期的记录 源数据
| MRLNum | CreatedOn | ReviseCode | RequiredQty |
|---|---|---|---|
| SAN-000027-001 | 2/27/2023 | 0 | 100 |
| SAN-000027-001 | 2/28/2023 | 1 | 30 |
| SAN-000027-001 | 3/29/2023 | 1 | 30 |
| SAN-000028-001 | 3/21/2023 | 1 | 30 |
| SAN-000028-001 | 3/23/2023 | 1 | 30 |
| SAN-000028-001 | 3/29/2023 | 1 | 30 |
| SAN-000028-001 | 3/30/2023 | 1 | 30 |
期望结果
| MRLNum | CreatedOn | ReviseCode | RequiredQty |
|---|---|---|---|
| SAN-000027-001 | 2/28/2023 | 1 | 30 |
| SAN-000027-001 | 3/29/2023 | 1 | 30 |
| SAN-000028-001 | 3/29/2023 | 1 | 30 |
| SAN-000028-001 | 3/30/2023 | 1 | 30 |
解决方案(SQL实现)
使用窗口函数ROW_NUMBER()按MRLNum分组,对每组内的记录按CreatedOn倒序排序,筛选排序序号为1和2的记录(对应最新和上一日期的记录):
WITH ranked_records AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY MRLNum ORDER BY CONVERT(date, CreatedOn, 101) DESC) AS rn FROM your_table_name ) SELECT MRLNum, CreatedOn, ReviseCode, RequiredQty FROM ranked_records WHERE rn <= 2 ORDER BY MRLNum, CreatedOn;
逻辑说明
PARTITION BY MRLNum:按MRLNum字段对数据分组,确保每个编号的记录单独处理ORDER BY CONVERT(date, CreatedOn, 101) DESC:将CreatedOn转换为标准日期格式后倒序排序,保证最新日期的记录排在组内首位ROW_NUMBER():为每组内的记录生成递增序号,最新日期对应序号1,上一日期对应序号2- 最后筛选序号≤2的记录,即可得到目标结果
内容的提问来源于stack exchange,提问作者wfxasb
相关产品推荐
相关产品推荐

