T-SQL:GROUP BY,但保留一个未分组的列(或重新加入它)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T-SQL:GROUP BY,但保留一个未分组的列(或重新加入它)?相关的知识,希望对你有一定的参考价值。

我在SQL Server 2008上,并且无法按照我想要的方式查询审计表。

该表显示每次有新ID进入时,以及每次ID类型更改时

Record #    ID          Type    Date
1           ae08k       M       2017-01-02:12:03
2           liei0       A       2017-01-02:12:04
3           ae08k       C       2017-01-02:13:05
4           we808       A       2017-01-03:20:05

我想在某个特定日期生成每个ID状态的快照。我的想法是这样的:

SELECT
    ID
    ,max(date) AS Max

FROM
    Table

WHERE
    Date < 'whatever-my-cutoff-date-is-here'

GROUP BY
    ID

但那会失去Type列。如果我将类型列添加到我的GROUP BY中,那么对于日期之前的所有类型,我会自然地获得每个ID的重复行。

所以我在考虑运行表的第二个版本(通过公共表表达式),然后将其连接到以获取Type。

在我上面的查询中,我必须加入的是ID和日期。不知何故,如果日期过于接近,我最终会得到重复的结果(如上所述,ae08k会为每种类型显示一次)。那或者我只是非常困惑。

基本上我在SQL中做的就是左连接,分组和公用表表达式(然后左连接)。在这种情况下我想要的是什么?

答案

使用row_number()

select *  
from ( select *
            , row_number() over (partition by id order by date desc) as rn 
       from table 
       WHERE Date < 'whatever-my-cutoff-date-is-here'
     ) tt
where tt.rn = 1
另一答案

我想知道在某个特定日期,每种类型的ID有多少。

好吧,为此您在类型上使用COUNTGROUP BY

SELECT Type, COUNT(ID)
FROM Table
WHERE Date < 'whatever-your-cutoff-date-is-here'
GROUP BY Type
另一答案

根据你在Zohar Peled的评论回答你可能正在寻找这样的事情:

; with cte as (select distinct ID from Table where Date < '$param')
select [data].*, [data2].[count]
from cte
cross apply 
( select top 1 *
  from Table
  where Table.ID = cte.ID
  and Table.Date < '$param'
  order by Table.Date desc
) as [data]
cross apply
( select count(1) as [count]
  from Table
  where Table.ID = cte.ID
  and Table.Date < '$param'
) as [data2]

以上是关于T-SQL:GROUP BY,但保留一个未分组的列(或重新加入它)?的主要内容,如果未能解决你的问题,请参考以下文章

应用 group_by 并汇总数据,同时保留所有列的信息

带有 GROUP BY id 的 T-SQL SELECT

在 SQL 中选择不在 Group By 中的列

T-Sql语法:GROUP BY子句GROUPING SETSCUBEROLLUP

oracle中group by用法

SQL中group by 与 compute by