Sql 如何保存每组中最新项目的所有记录
我有一个Oracle数据库,每行包含Sql 如何保存每组中最新项目的所有记录,sql,oracle,dense-rank,Sql,Oracle,Dense Rank,我有一个Oracle数据库,每行包含 乘客乘坐的航班数量(PLNR) 航班日期(PLDATE) 旅客票号(TKTNUM) 示例内容: PLNR PLDATE TKTNUM 100 10/01/2017 1234 100 11/01/2017 1235 100 11/01/2017 1236 200 9/01/2017 7890 200 10/01/2017 7891 200 10/01/2017 5678 我想保
- 乘客乘坐的航班数量(PLNR)
- 航班日期(PLDATE)
- 旅客票号(TKTNUM)
PLNR PLDATE TKTNUM
100 10/01/2017 1234
100 11/01/2017 1235
100 11/01/2017 1236
200 9/01/2017 7890
200 10/01/2017 7891
200 10/01/2017 5678
我想保留每个航班号的最新航班的所有机票号码
示例输出:
PLNR PLDATE TKTNUM
100 11/01/2017 1235
100 11/01/2017 1236
200 10/01/2017 7891
200 10/01/2017 5678
我在网上搜索了几篇帖子,建议使用dense_rank和keep first,但我很难结合多个标准(例如PLDATE和PLNR)来获得多个记录
你能提出一个解决方案,更重要的是,解释一下它是如何工作的吗?(我正在翻译这篇文章)
谢谢你的帮助
WITH CTE AS (SELECT PLNR, PLDATE, TKTNUM
, Dense_Rank ()Over (partition by PLNR, Trunc(PLDATE) order by PLDATE DESC) DR)
SELECT *
FROM cte
WHERE DR= 1
需要一个CTE或子查询,因为DR必须在内存中具体化,然后我们才能使用它进行限制
over
语法是一个分析函数,它为每个分区(PLNR和trunc(PLDATE))分配按日期降序排列的顺序秩。由于我们使用的是稠密秩函数,相同的日期将被分配相同的值。因此,最新的PLDATE将始终具有每个PLNR/PLDATE 1的秩
因此,CTE的结果如下:
PLNR PLDATE TKTNUM DR
100 10/01/2017 1234 2
100 11/01/2017 1235 1
100 11/01/2017 1236 1
200 9/01/2017 7890 2
200 10/01/2017 7891 1
200 10/01/2017 5678 1
我们只在选择中保留1,与CTE相对
现在我在PLDATE上使用了Trunc,以防它包含一个时间组件,因为我们不想把事情搞砸;因为如果输入,oracle通常会同时存储这两个组件。使用:
SELECT PLNR, PLDATE, TKTNUM
FROM (
SELECT t.*,
max(PLDATE) Over (Partition By PLNR) As dt
FROM table
)
WHERE PLDATE = dt
可能需要trunc PLDate()我认为oracle总是记录时间,因此根据日期的输入方式,它们可能有一个时间组件。