Oracle:从选择中选择

时间:2013-12-18 19:29:13

标签: sql oracle

这是我的Oracle(11g)表:

--------------------------
|MyTable                 |
--------------------------
|UserID    |Date         |
--------------------------
|1          |4/29/2011   |
|1          |6/13/2013   |
|2          |5/3/2001    |
|2          |2/3/2011    |
|3          |12/3/2009   |
|3          |4/3/2011    |
--------------------------

如果我执行以下SQL:

SELECT MAX(Date) AS upd_dt, UserID 
FROM MyTable
GROUP BY upd_dt, UserID

我明白了:

--------------------------
|User ID    |Date        |
--------------------------
|1          |6/13/2013   |
|2          |2/3/2011    |
|3          |4/3/2011    |
--------------------------

我理解。我现在想对这些结果执行SELECT并获取具有最新日期及其userID的行。有没有办法从SELECT中选择?类似的东西:

SELECT MAX(upd_dt) AS maxdt, UserID 
FROM (    
        SELECT MAX(Date) AS upd_dt, UserID 
        FROM MyTable
        GROUP BY upd_dt, UserID
     )

GROUP BY maxdt, UserID

3 个答案:

答案 0 :(得分:1)

我会说你的第一个查询应该更像是:

SELECT MAX(Date) AS upd_dt, UserID 
FROM MyTable
GROUP BY UserID

对于第二个查询,是的,您可以使用子查询。而且我认为你不需要聚合:

SELECT * 
FROM (        
    SELECT Date, UserID 
    FROM MyTable
    ORDER BY Date dESC
)
WHERE ROWNUM < 2;

请注意,您需要将ORDER BY放入内部查询中,然后在外部查询中使用ROWUM进行过滤。否则,您正在做的是SELECT第一个检索到的行(无论哪个),然后ORDER该单行。另请注意,除非您将过滤限制为小于(ROWNUM

,否则<通常会按预期工作

答案 1 :(得分:1)

我认为你可以在没有子查询的情况下做到这一点:

SELECT MAX(Date) AS upd_dt,
       MAX(UserID) keep(dense_rank last order by Date) as UserID
  FROM MyTable;

澄清这一部分:MAX(UserID)。考虑让两行具有相同的最大Date和不同的UserID

--------------------------
|MyTable                 |
--------------------------
|UserID      Date        |
--------------------------
|1          |6/13/2013   |
|2          |6/13/2013   |
--------------------------

所以你必须决定选哪一个。使用该汇总MAX(UserID)MIN(UserID),您可以改变结果。

答案 2 :(得分:0)

你甚至需要汇总吗?只需按日期desc排序并选择top userid

select * from (select upd_dt, UserID from MyTable order by upd_dt desc) where rownum < 2