Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何保存每组中最新项目的所有记录_Sql_Oracle_Dense Rank - Fatal编程技术网

Sql 如何保存每组中最新项目的所有记录

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 我想保

我有一个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
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总是记录时间,因此根据日期的输入方式,它们可能有一个时间组件。