存在重复项时如何 select 唯一记录
How to select unique records when duplicates exist
我正在尝试编写一个只显示每个 APEL_ID
的最新 HEAR_DT 的查询
SELECT APEL_ID, HEAR_DT
FROM HEARINGS
APEL_ID
HEAR_DT
101
01-OCT-08
101
02-OCT-08
101
03-OCT-08
102
06-OCT-08
102
07-OCT-08
102
08-OCT-08
103
09-OCT-08
103
10-OCT-08
103
11-OCT-08
104
23-OCT-08
104
24-OCT-08
104
25-OCT-08
104
25-OCT-08
当我像往常一样编写查询时,我在一定程度上得到了唯一的记录,但是 HEAR_DT 相同的记录都出现了
HEAR_DT 是“日期”而不是“日期时间”数据类型,所以我无法使用时间
select Max
的组成部分
是否可以对此查询(或编写的不同查询)执行任何操作,以仅显示唯一记录。我想展示任何显示为重复项的内容。他们中的哪一个被选中并不重要。 (类似于“前 1”或“任意”)
SELECT APEL_ID, MAX(HEAR_DT) AS LATEST_HEAR_DT
FROM HEARINGS
GROUP BY APEL_ID
APEL_ID
最新_HEAR_DT
101
03-OCT-08
102
08-OCT-08
103
11-OCT-08
104
25-OCT-08
104
25-OCT-08
这个查询:
SELECT APEL_ID, MAX(HEAR_DT) AS LATEST_HEAR_DT
FROM HEARINGS
GROUP BY APEL_ID;
应该 return 每个 APEL_ID
恰好一行。它不会 return 多行。
如果您想要原始数据中的行,每个 APEL_ID
一行,请使用 window 函数:
SELECT h.*
FROM (SELECT h.*,
ROW_NUMBER() OVER (PARTITION BY APEL_ID ORDER BY HEAR_DT DESC) as seqnum
FROM HEARINGS h
) h
WHERE seqnum = 1;
这是解决方案。这有效
SELECT UNIQUE APEL_ID, MAX(TO_DATE(HEAR_DT, 'DD-MON-YY')) AS LATEST_HEAR_DT
FROM mytable
GROUP BY APEL_ID
我正在尝试编写一个只显示每个 APEL_ID
的最新 HEAR_DT 的查询SELECT APEL_ID, HEAR_DT
FROM HEARINGS
APEL_ID | HEAR_DT |
---|---|
101 | 01-OCT-08 |
101 | 02-OCT-08 |
101 | 03-OCT-08 |
102 | 06-OCT-08 |
102 | 07-OCT-08 |
102 | 08-OCT-08 |
103 | 09-OCT-08 |
103 | 10-OCT-08 |
103 | 11-OCT-08 |
104 | 23-OCT-08 |
104 | 24-OCT-08 |
104 | 25-OCT-08 |
104 | 25-OCT-08 |
当我像往常一样编写查询时,我在一定程度上得到了唯一的记录,但是 HEAR_DT 相同的记录都出现了
HEAR_DT 是“日期”而不是“日期时间”数据类型,所以我无法使用时间 select Max
的组成部分是否可以对此查询(或编写的不同查询)执行任何操作,以仅显示唯一记录。我想展示任何显示为重复项的内容。他们中的哪一个被选中并不重要。 (类似于“前 1”或“任意”)
SELECT APEL_ID, MAX(HEAR_DT) AS LATEST_HEAR_DT
FROM HEARINGS
GROUP BY APEL_ID
APEL_ID | 最新_HEAR_DT |
---|---|
101 | 03-OCT-08 |
102 | 08-OCT-08 |
103 | 11-OCT-08 |
104 | 25-OCT-08 |
104 | 25-OCT-08 |
这个查询:
SELECT APEL_ID, MAX(HEAR_DT) AS LATEST_HEAR_DT
FROM HEARINGS
GROUP BY APEL_ID;
应该 return 每个 APEL_ID
恰好一行。它不会 return 多行。
如果您想要原始数据中的行,每个 APEL_ID
一行,请使用 window 函数:
SELECT h.*
FROM (SELECT h.*,
ROW_NUMBER() OVER (PARTITION BY APEL_ID ORDER BY HEAR_DT DESC) as seqnum
FROM HEARINGS h
) h
WHERE seqnum = 1;
这是解决方案。这有效
SELECT UNIQUE APEL_ID, MAX(TO_DATE(HEAR_DT, 'DD-MON-YY')) AS LATEST_HEAR_DT
FROM mytable
GROUP BY APEL_ID