当 ID 列不同时,在 SQL 中选择最近的重复项
Pick most recent duplicate in SQL when ID column is different
好吧,假设我有这样的数据:
ID GROUP TIMESTAMP col_OTHER
001 AA 2021-04-02 15:02:33.319 mangos
002 BB 2021-04-01 05:56:35.334 kiwis
004 AA 2021-04-02 03:51:35.279 oranges
003 DD 2021-04-01 18:24:23.469 oranges
003 DD 2021-04-02 12:16:21.539 bananas
002 CC 2021-04-02 11:02:51.313 apples
所以我真正想做的就是使用 SQL 来操纵它,以便在有多个 ID 时提供具有最新日期的 DF。
最终产品:
ID GROUP TIMESTAMP col_OTHER
001 AA 2021-04-02 15:02:33.319 mangos
004 AA 2021-04-02 03:51:35.279 oranges
003 DD 2021-04-02 12:16:21.539 bananas
002 CC 2021-04-02 11:02:51.313 apples
我的主管建议我按 ID 和组进行分区,然后 select 最大值(时间戳)以便我们保留最新的组。但是 PARTITION() 甚至是必要的吗???也许他想保留网站用户的数量,但也只保留 select 上面的那些。
你可以这样做:
select *
from (
select *,
row_number() over(partition by id order by timestamp desc) as rn
from t
) x
where rn = 1
您还可以使用 window 函数 RANK()
PARTITION 定义了获得递增数字的行组。
如果没有它,您将获得 **所有++ 行的序列号,因此可能无法仅获得第一个或第二个或您想要的数字
CREATE TABLE table1 (
`ID` VARCHAR(4),
`GROUP` VARCHAR(2),
`TIMESTAMP` TIMESTAMP,
`col_OTHER` VARCHAR(7)
);
INSERT INTO table1
(`ID`, `GROUP`, `TIMESTAMP`, `col_OTHER`)
VALUES
('001', 'AA', '2021-04-02 15:02:33.319', 'mangos'),
('002', 'BB', '2021-04-01 05:56:35.334', 'kiwis'),
('004', 'AA', '2021-04-02 03:51:35.279', 'oranges'),
('003', 'DD', '2021-04-01 18:24:23.469', 'oranges'),
('003', 'DD', '2021-04-02 12:16:21.539', 'bananas'),
('002', 'CC', '2021-04-02 11:02:51.313', 'apples');
sELECT
`ID`, `GROUP`, `TIMESTAMP`, `col_OTHER`
FROM ( SELECT *,
RANK() OVER (
PARTITION BY ID
ORDER BY `TIMESTAMP` DESC) rnk
FROM table1) t1
WHERE rnk = 1
ID | GROUP | TIMESTAMP | col_OTHER
:-- | :---- | :------------------ | :--------
001 | AA | 2021-04-02 15:02:33 | mangos
002 | CC | 2021-04-02 11:02:51 | apples
003 | DD | 2021-04-02 12:16:22 | bananas
004 | AA | 2021-04-02 03:51:35 | oranges
db<>fiddle here
好吧,假设我有这样的数据:
ID GROUP TIMESTAMP col_OTHER
001 AA 2021-04-02 15:02:33.319 mangos
002 BB 2021-04-01 05:56:35.334 kiwis
004 AA 2021-04-02 03:51:35.279 oranges
003 DD 2021-04-01 18:24:23.469 oranges
003 DD 2021-04-02 12:16:21.539 bananas
002 CC 2021-04-02 11:02:51.313 apples
所以我真正想做的就是使用 SQL 来操纵它,以便在有多个 ID 时提供具有最新日期的 DF。
最终产品:
ID GROUP TIMESTAMP col_OTHER
001 AA 2021-04-02 15:02:33.319 mangos
004 AA 2021-04-02 03:51:35.279 oranges
003 DD 2021-04-02 12:16:21.539 bananas
002 CC 2021-04-02 11:02:51.313 apples
我的主管建议我按 ID 和组进行分区,然后 select 最大值(时间戳)以便我们保留最新的组。但是 PARTITION() 甚至是必要的吗???也许他想保留网站用户的数量,但也只保留 select 上面的那些。
你可以这样做:
select *
from (
select *,
row_number() over(partition by id order by timestamp desc) as rn
from t
) x
where rn = 1
您还可以使用 window 函数 RANK()
PARTITION 定义了获得递增数字的行组。
如果没有它,您将获得 **所有++ 行的序列号,因此可能无法仅获得第一个或第二个或您想要的数字
CREATE TABLE table1 ( `ID` VARCHAR(4), `GROUP` VARCHAR(2), `TIMESTAMP` TIMESTAMP, `col_OTHER` VARCHAR(7) ); INSERT INTO table1 (`ID`, `GROUP`, `TIMESTAMP`, `col_OTHER`) VALUES ('001', 'AA', '2021-04-02 15:02:33.319', 'mangos'), ('002', 'BB', '2021-04-01 05:56:35.334', 'kiwis'), ('004', 'AA', '2021-04-02 03:51:35.279', 'oranges'), ('003', 'DD', '2021-04-01 18:24:23.469', 'oranges'), ('003', 'DD', '2021-04-02 12:16:21.539', 'bananas'), ('002', 'CC', '2021-04-02 11:02:51.313', 'apples');
sELECT `ID`, `GROUP`, `TIMESTAMP`, `col_OTHER` FROM ( SELECT *, RANK() OVER ( PARTITION BY ID ORDER BY `TIMESTAMP` DESC) rnk FROM table1) t1 WHERE rnk = 1
ID | GROUP | TIMESTAMP | col_OTHER :-- | :---- | :------------------ | :-------- 001 | AA | 2021-04-02 15:02:33 | mangos 002 | CC | 2021-04-02 11:02:51 | apples 003 | DD | 2021-04-02 12:16:22 | bananas 004 | AA | 2021-04-02 03:51:35 | oranges
db<>fiddle here