2012-07-20 89 views
1

如果我有一個表,該表格式如下:SQL選擇colums組由

ID NAME NUM TIMESTAMP BOOL 
1 A 5 09:50  TRUE 
1 B 6 13:01  TRUE 
1 A 1 10:18  FALSE 
2 A 3 12:20  FALSE 
1 A 1 05:30  TRUE 
1 A 12 06:00  TRUE 

我怎樣才能爲每一個獨特的ID編號,名稱和NUM,名稱對與最新的時間戳和BOOL = TRUE。

所以,對上面表中的輸出應該是:

ID NAME NUM 
1 A 5 
1 B 6 

我嘗試使用分組方式,但我似乎無法得到解決,要麼我需要把一個聚合函數各地NUM(最大值,最小值不會在應用於此示例時工作)或在組中指定它(這將最終匹配ID,NAME和NUM組合)。據我所知,兩者都會在某些情況下破裂。

任何幫助將不勝感激。

謝謝!

PS:我使用的SQL開發人員(即我認爲由Oracle開發的SQL,對不起,我在這一個新手)

+1

**什麼**數據庫系統,以及哪個版本? * SQL *只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品......這樣的功能通常是特定於供應商的 - 因此我們確實需要知道**數據庫系統**您正在使用.... – 2012-07-20 08:52:56

+1

我正在使用SQLDeveloper,並可能應該指定。 – user1536435 2012-07-20 08:58:51

回答

2

如果您使用至少SQL-Server 2005中您可以使用ROW_NUMBER功能:

WITH CTE AS 
(
    SELECT ID, NAME, NUM, 
     RN = ROW_NUMBER()OVER(PARTITION BY ID, NAME ORDER BY TIMESTAMP DESC) 
    FROM Table 
    WHERE BOOL='TRUE' 
) 
SELECT ID, NAME, NUM FROM CTE 
WHERE RN = 1 

結果:

ID  NAME NUM  
1  A  5  
1  B  6  

這裏的小提琴:http://sqlfiddle.com/#!3/a1dc9/10/0

+0

感謝您的支持,它的工作原理完美無瑕,但您能否解釋發生了什麼? – user1536435 2012-07-20 17:53:29

+0

@ user1536435:[CTE](http://msdn.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx)添加了['ROW_NUMBER'](http:// msdn .microsoft.com/en-us/library/ms186734.aspx)窗口函數作爲由['OVER-Clause'](http://msdn.microsoft.com/en-us/library/ms189461.aspx)分區的列。 。 「PARTITION BY」與「GROUP BY」類似。閱讀這裏的差異:http://iggyfernandez.wordpress.com/2010/03/19/comparison-between-window-functions-and-the-group-by-clause/在'OVER'中的'ORDER BY' - 條款確定集合中的行數。 – 2012-07-20 18:08:38

0
select t1.* from table as t1 inner join 
(
select NAME, NUM, max(TIMESTAMP) as TIMESTAMP from table 
where BOOL='TRUE' 
) as t2 
on t1.name=t2.name and t1.num=t2.num and t1.timestamp=t2.timestamp 
where t1.BOOL='TRUE' 
0
select t1.* 
from TABLE1 as t1 
left join 
TABLE1 as t2 
on t1.name=t2.name and t1.TIMESTAMP>t2.TIMESTAMP 
where t1.BOOL='TRUE' and t2.id is null 

應該爲你做。