oracle 拉取表中具有重复ID的最新记录

am46iovg  于 2023-05-28  发布在  Oracle
关注(0)|答案(2)|浏览(100)

| ID|日期|col1|
| - -----|- -----|- -----|
| 一个|2022年1月1日|苹果|
| 一个|2022年02月01日|橙子|
我已经有一段时间没有使用sql了(使用oracle fyi)。如果我想拉取唯一ID的最新日期(在这种情况下,只有第二行应该在结果中拉取),我怎么做?
我试过:

SELECT ID, MAX(DATE), col1
FROM table
GROUP BY ID

现在这不起作用了,因为我需要在SELECT中聚合col 1,或者在GROUP BY中抛出它。如果我把它扔到GROUP BY中,我会得到结果中的两行,对吗?但是如果我希望行基于max(date),我也不认为聚合col 1有什么意义。我错过了什么吗?

ipakzgxi

ipakzgxi1#

您可以使用LAG()、**LEAD()****ROW_NUMBER()**函数来实现此目标。检查我下面的查询。

使用LAG():

SELECT 
    ID, 
    DATE, 
    col1
FROM 
(
    SELECT 
        *,
        LAG(DATE, 1) OVER(Partition By ID ORDER BY DATE DESC) AS DateOfPreviousRow
     FROM Table
) T
WHERE DateOfPreviousRow IS NULL

使用LEAD():

SELECT 
    ID, 
    DATE, 
    col1
FROM 
(
    SELECT 
        *,
        LEAD(DATE, 1) OVER(Partition By ID ORDER BY DATE) AS DateOfPreviousRow
    FROM Table
) T
WHERE DateOfPreviousRow IS NULL

使用ROW_NUMBER():

SELECT T.* FROM 
(
   SELECT 
       *,
       ROW_NUMBER() OVER(PARTITION BY ID ORDER BY DATE DESC) AS ROWNumber
   FROM Table
) T
WHERE ROWNumber = 1
u4dcyp6a

u4dcyp6a2#

可以使用ROW_NUMBER()。例如:

select *
from (
  select t.*,
    row_number() over(partition by id order by date desc) as rn
  from t
) x
where rn = 1

相关问题