提取 table 中具有重复 ID 的最新记录
Pull latest record in table with duplicate ID's
ID
DATE
col1
1
01-01-2022
apple
1
01-02-2022
orange
自从我使用 sql(使用 oracle fyi)以来已经有一段时间了。如果我想提取具有最新日期的唯一 ID(在这种情况下,结果中只应提取第二行),我该怎么做?
我试过了:
SELECT ID, MAX(DATE), col1
FROM table
GROUP BY ID
现在这不起作用,因为我需要在 SELECT 中聚合 col1 或将其放入 GROUP BY。如果我把它放在 GROUP BY 中,我会得到结果中的两行,对吗?但是如果我想要基于 max(date) 的行,我也看不到聚合 col1 的意义。我在这里遗漏了什么吗?
您可以使用 ROW_NUMBER()
。例如:
select *
from (
select t.*,
row_number() over(partition by id order by date desc) as rn
from t
) x
where rn = 1
您可以使用 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
ID | DATE | col1 |
---|---|---|
1 | 01-01-2022 | apple |
1 | 01-02-2022 | orange |
自从我使用 sql(使用 oracle fyi)以来已经有一段时间了。如果我想提取具有最新日期的唯一 ID(在这种情况下,结果中只应提取第二行),我该怎么做?
我试过了:
SELECT ID, MAX(DATE), col1
FROM table
GROUP BY ID
现在这不起作用,因为我需要在 SELECT 中聚合 col1 或将其放入 GROUP BY。如果我把它放在 GROUP BY 中,我会得到结果中的两行,对吗?但是如果我想要基于 max(date) 的行,我也看不到聚合 col1 的意义。我在这里遗漏了什么吗?
您可以使用 ROW_NUMBER()
。例如:
select *
from (
select t.*,
row_number() over(partition by id order by date desc) as rn
from t
) x
where rn = 1
您可以使用 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