Sql Oracle:从选择列表中选择
这是我的Oracle 11g表:Sql Oracle:从选择列表中选择,sql,oracle,Sql,Oracle,这是我的Oracle 11g表: -------------------------- |MyTable | -------------------------- |UserID |Date | -------------------------- |1 |4/29/2011 | |1 |6/13/2013 | |2 |5/3/2001 | |2 |2/3/
--------------------------
|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 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
你还需要为此辩护吗?只需按日期说明订购,然后选择top userid
select * from (select upd_dt, UserID from MyTable order by upd_dt desc) where rownum < 2
我想说,您的第一个查询应该更像:
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进行筛选。否则,您要做的是选择第一个检索到的行(无论是哪一行),然后对该行进行排序。另外请注意,ROWNUM通常不会像您预期的那样工作,除非您将筛选限制为小于,我认为您可以在不使用子查询的情况下执行此操作:
SELECT MAX(Date) AS upd_dt,
MAX(UserID) keep(dense_rank last order by Date) as UserID
FROM MyTable;
为了澄清这一部分:MAXUserID。考虑两行具有相同的最大日期和不同的用户ID。< /P>
所以你必须决定选哪一个。使用聚合的MAXUserID或MINUserID,您可以改变结果。为什么不使用where rownum=1 order by upd_dt desc???@jcho360如果没有子查询,它将无法工作。我不想在子查询中这样做。一般来说,您可以使用查询来代替表名。在关系理论中,您总是可以做到这一点,但在实际实现中存在限制。查询的表、视图和结果集都是关系所指的关系。@jcho360据我所知,您必须在子查询内按顺序排列,在该子查询外按WHERE ROWNUM=1排列。否则在排序之前进行筛选。rownum是在排序之前分配的,因此必须有子查询。
--------------------------
|MyTable |
--------------------------
|UserID Date |
--------------------------
|1 |6/13/2013 |
|2 |6/13/2013 |
--------------------------