首页 > 解决方案 > 当 ID 列不同时,在 SQL 中选择最近的重复项

问题描述

好吧,假设我有如下数据:

 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 和组进行分区,然后选择最大值(时间戳),以便我们保留最新的组。但是 PARTITION() 甚至是必要的吗???也许他想保留网站用户的数量,但也只选择上面的那些。

标签: mysqlsqlgroup-bypartition

解决方案


您还可以使用窗口函数 RANK()

PARTITION 定义了获得递增数字的行组。

没有它,您将获得 **all++ 行的序列号,因此无法仅获得第一个或第二个或您想要的数字

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
身份证 | 集团 | 时间戳 | col_OTHER
:-- | :---- | :----------------- | :--------
001 | 机管局 | 2021-04-02 15:02:33 | 芒果   
002 | 抄送 | 2021-04-02 11:02:51 | 苹果   
003 | DD | 2021-04-02 12:16:22 | 香蕉  
004 | 机管局 | 2021-04-02 03:51:35 | 橘子  

db<>在这里摆弄


推荐阅读