【问题标题】:SQL: Get latest record grouped by multiple columns in Oracle DBSQL:获取Oracle DB中按多列分组的最新记录
【发布时间】:2017-06-12 17:05:30
【问题描述】:

我有一个表 SITE_SETTINGS,如下所示:

SITE_ID   SETTINGS_CODE   UPDATE_TS   OTHER_SETTINGS1   OTHER_SETTINGS2
1         CODE1           21-JAN-17   S1                S2
1         CODE1           23-JAN-17   S3                S4
1         CODE2           14-JAN-17   S1                S4
1         CODE2           18-JAN-17   S1                S3
1         CODE2           21-JAN-17   S1                S2
1         CODE3           04-FEB-17   S8                S9
2         CODE1           21-MAR-17   S1                S2
2         CODE2           21-JAN-17   S2                S5
2         CODE1           21-MAR-17   S1                S5
2         CODE2           10-MAR-17   S1                S5
2         CODE3           10-JAN-17   S1                S5

这些是多个站点,每个站点都有 3 种不同类型的 SETTINGS_CODE。我需要所有站点的每个 settings_code 的最新记录。像这样的:

SITE_ID   SETTINGS_CODE   UPDATE_TS   OTHER_SETTINGS1   OTHER_SETTINGS2
1         CODE1           23-JAN-17   S3                S4
1         CODE2           21-JAN-17   S1                S2
1         CODE3           04-FEB-17   S8                S9
2         CODE1           21-MAR-17   S1                S2
2         CODE2           10-MAR-17   S1                S5
2         CODE3           10-JAN-17   S1                S5

我正在尝试在表上进行连接,但它给了我重复的记录。例如,我为 SITE_ID=1 的 CODE1 获得了多个相同的记录。这是我尝试过的:

        select t.SITE_ID, t.SETTINGS_CODE, t.OTHER_SETTINGS1, t.OTHER_SETTINGS2, t.UPDATE_TS
        from SITE_SETTINGS t
        inner join (
            select SITE_ID, SETTINGS_CODE, max(UPDATE_TS) as MaxDate
            from SITE_SETTINGS
            group by SITE_ID, SETTINGS_CODE
            order by SITE_ID, SETTINGS_CODE
        ) tm on t.SITE_ID = tm.SITE_ID and t.SETTINGS_CODE=tm.SETTINGS_CODE and t.UPDATE_TS = tm.MaxDate

我认为我遇到的问题是无法按多列分组。有什么方法可以获取不重复的数据?

【问题讨论】:

    标签: sql oracle join group-by multiple-columns


    【解决方案1】:

    您可以使用row_number() 窗口函数来做到这一点:

    select * from (
        select SITE_SETTINGS.*, row_number() over(partition by SITE_ID,   SETTINGS_CODE order by UPDATE_TS desc) as rn 
        from SITE_SETTINGS
    ) t
    where rn = 1
    

    【讨论】:

      【解决方案2】:
      SELECT SITE_ID,
             SETTINGS_CODE,
             LATEST_UPDATE_TS,
             OTHER_SETTINGS1,
             OTHER_SETTINGS2 
        FROM 
          (
            SELECT SITE_ID,
                   SETTINGS_CODE,
                   UPDATE_TS,
                   MAX( UPDATE_TS ) OVER ( PARTITION BY SITE_ID,SETTINGS_CODE ORDER BY 
                   UPDATE_TS ) AS LATEST_UPDATE_TS,
                   OTHER_SETTINGS1,
                   OTHER_SETTINGS2   
              FROM SITE_SETTINGS
          )
      WHERE UPDATE_TS = LATEST_UPDATE_TS;
      

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 2022-12-04
        • 2021-12-03
        • 2021-04-06
        • 2021-11-04
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多