SQL: 获取 Oracle DB 中按多列分组的最新记录
SQL: Get latest record grouped by multiple columns in Oracle DB
我有一个 table 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
我正在尝试对 table 自身进行连接,但它给了我重复的记录。例如,对于 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
我认为我遇到的问题是无法按多列分组。有没有办法获取不重复的数据?
您可以使用 row_number()
window 函数执行此操作:
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
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;
我有一个 table 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
我正在尝试对 table 自身进行连接,但它给了我重复的记录。例如,对于 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
我认为我遇到的问题是无法按多列分组。有没有办法获取不重复的数据?
您可以使用 row_number()
window 函数执行此操作:
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
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;