这是我的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
答案 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