SQL选择列分组

时间:2012-07-20 08:48:43

标签: sql oracle group-by

如果我的表格格式如下:

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的ID,NAME和NUM,NAME对与最新的时间戳和BOOL = TRUE。

因此,对于上表,输出应为:

ID NAME NUM
1  A    5
1  B    6   

我尝试使用Group By但是我似乎无法解决这个问题,我需要将聚合器函数放在num周围(max,min在应用于此示例时不起作用)或者在group by中指定它(最终会匹配ID,NAME和NUM组合)。在某些情况下,我认为都会破坏。

PS:我正在使用SQL Developer(这是Oracle开发的SQL我认为,抱歉我是新手)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'

答案 2 :(得分: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

应该为你做。