Group BY具有COUNT,但是对于未包含在组中的列的Order

时间:2015-05-27 09:49:55

标签: sql tsql

我有一张表格,我需要获取ID一个组(基于IDNameCOUNT(*) = 3,最新一组时间戳。

因此,例如下面,我想要检索ID 2。由于它有3行和最新的时间戳(即使ID 3总体上有最新的时间戳,它的计数也不是3)。

但我不明白如何按Date订购,因为我不能在Group By条款中包含它,因为它不相同:

SELECT TOP 1 ID
FROM TABLE
GROUP BY ID,Name
HAVING COUNT(ID) > 2
AND Name = 'ABC'
--ORDER BY Date DESC

示例数据

ID  Name  Date
1   ABC   2015-05-27 08:00
1   ABC   2015-05-27 09:00
1   ABC   2015-05-27 10:00
2   ABC   2015-05-27 11:00
2   ABC   2015-05-27 12:00
2   ABC   2015-05-27 13:00
3   ABC   2015-05-27 14:00
3   ABC   2015-05-27 15:00

3 个答案:

答案 0 :(得分:3)

在SQL Server中,您需要聚合不在列表中的列:

SELECT TOP 1 ID
FROM TABLE
WHERE Name = 'ABC'
GROUP BY ID,Name
HAVING COUNT(ID) > 2
ORDER BY MAX(Date) DESC

如果您确实需要,可以将名称过滤器放在组之前,以获得更好的性能。

答案 1 :(得分:0)

您可以在嵌套查询中执行此操作。

子查询:

SELECT ID 
 from TABLE 
GROUP BY ID 
HAVING Count(ID) > 2

它可以为您提供所需的ID。把它放在另一个查询中:

SELECT ID, Data 
  FROM Table 
Where ID in (Subquery)
Order by Date DESC;

答案 2 :(得分:-1)

首先获取所有需要的ID。这是所有具有计数>的ID。 2.获取每个此类ID的最长日期。然后使用ROW_NUMBER对这些记录进行排名,给出最新的ID#1。最后删除所有未排名为#1的ID。

select name, id
from
(
  select 
    name, id, row_count() over (partition by name order by max_date desc) as rn
  from
  (
    select name, id, max(date) as max_date
    from mytable
    --where name = 'ABC'
    group by name, id
    having count(*) > 2
  ) wanted_ids
) ranked_ids
where rn = 1;