让我说我有一张桌子:
USER_ID DATE EXT_DATA1 EXT_DATA2 EXT_DATA3 EXT_DATA4 EXT_DATA5
11 031213 77 aa bb cc dd
11 031213 77 aa bb cc dd
11 041213 77 aa bb1 cc dd1
11 051213 78 aa bb2 cc1 dd2
12 040313 79 aa bb4 cc dd
我尝试使用MIN日期和所有其余字段获取唯一的user_id:
SELECT MIN(DATE) AS ACTUAL_DATE,USER_ID,EXT_DATA1,EXT_DATA2,EXT_DATA3,EXT_DATA4,EXT_DATA5 /
GROUP BY EXT_DATA1,EXT_DATA2,EXT_DATA3,EXT_DATA4,EXT_DATA5 ;
但是因为我在EXT_DATA1,EXT_DATA2等列中有不同的值
我在最终结果中得到重复:
USER_ID DATE EXT_DATA1 EXT_DATA2 EXT_DATA3 EXT_DATA4 EXT_DATA5
11 041213 77 aa bb1 cc dd1
11 051213 78 aa bb2 cc1 dd2
12 040313 79 aa bb4 cc dd
编辑以解决说明中的错误
答案 0 :(得分:3)
这应该可以为您提供所需的结果:
SELECT t1.USER_ID,
t1.DATE,
t1.EXT_DATA1,
t1.EXT_DATA2,
t1.EXT_DATA3,
t1.EXT_DATA4,
t1.EXT_DATA5
FROM Table1 t1
LEFT JOIN Table1 t2 ON t1.USER_ID = t2.USER_ID
AND t1.DATE > t2.DATE
WHERE t2.USER_ID IS NULL
注意:如果多个行中存在最小的日期,则每个user_id可能会返回多行。
答案 1 :(得分:1)
它能完成这项工作吗?
SELECT ACTUAL_DATE,USER_ID,EXT_DATA1,EXT_DATA2,EXT_DATA3,EXT_DATA4,EXT_DATA5
FROM
(
SELECT "DATE" AS ACTUAL_DATE,
USER_ID,EXT_DATA1,EXT_DATA2,EXT_DATA3,EXT_DATA4,EXT_DATA5,
ROW_NUMBER() OVER(PARTITION BY USER_ID ORDER BY "DATE" ) as rn
FROM table_name
)a
WHERE rn = 1;
<强>更新强>
由于DATE
是Oracle中的关键字,因此需要转义(使用双引号)。查询使用分析(或窗口)函数ROW_NUMBER来获取每个用户的第一行(按日期排序)