2012-07-20 92 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 

应该为你做。