使用sql选择与user_id不同的最小日期和所有其余用户字段

时间:2013-12-05 16:57:25

标签: sql oracle-sqldeveloper

让我说我有一张桌子:

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

编辑以解决说明中的错误

2 个答案:

答案 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

sqlfiddle demo

注意:如果多个行中存在最小的日期,则每个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来获取每个用户的第一行(按日期排序)