2013-12-18 84 views
0

這裏是我的Oracle(11克)表:甲骨文:選擇從選擇

-------------------------- 
|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並獲取最近日期和其用戶標識的行。有沒有辦法從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

爲什麼不使用'where rownum = 1 order by upd_dt desc' ?? – jcho360

+0

@ jcho360如果沒有子查詢,它將無法正常工作 – gpeche

+0

我不是在子查詢中進行說明 – jcho360

回答

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過濾。否則,你正在做的是第一個檢索到的行(可能是哪個),然後是ORDER這個單行。還要注意的是ROWNUM將一般工作像您期望的,除非你限制過濾,小於(<

0

你甚至需要灌溉嗎?只需按日期倒序並選擇頂部的用戶ID

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

'rownum'是在訂購前分配的,所以必須有子查詢。 –

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)你可以改變結果。