SQL Server-使用分组依据时,如何在Select语句中具有未聚合的列?

时间:2018-06-28 08:33:35

标签: sql sql-server group-by

我希望每个不同的ID为MAX(Date)。这很简单:

SELECT
    Id,
    MAX(LastModifiedDate)
FROM 
    [MyServer].[Database].[Table]
GROUP BY
    Id;

但是我还需要包括其他列,例如名字,姓氏,公司等。 不能聚合,并且如果我将它们放在GROUP BY子句中将不起作用,因为这样它会返回我不想要的行。

5 个答案:

答案 0 :(得分:1)

为此,请尝试使用over()而不是使用group by:

select Id, <any other thing you want>,max(LastModifiedDate) over (partition by Id) as LastModifiedDate
FROM [MyServer].[Database].[Table]; 

答案 1 :(得分:1)

使用该查询通过ID和上次修改日期对同一张表格进行过滤。

SELECT
    T.*
FROM
    [MyServer].[Database].[Table] AS T
    INNER JOIN (
        select Id,
        MAX(LastModifiedDate) AS  MaxLastModifiedDate
        FROM [MyServer].[Database].[Table]
        group by Id
    ) AS N ON 
        T.Id = N.Id AND
        N.MaxLastModifiedDate = T.LastModifiedDate

编辑:如果每个ID都有多个最大日期,则不能使用它们的值进行过滤。您可以使用ROW_NUMBER对其进行排名:

;WITH MaxByRowNumber AS
(
    SELECT
        T.*,
        LastModifiedDateRanking = ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY T.LastModifiedDate DESC)
    FROM 
        [MyServer].[Database].[Table] AS T
)
SELECT
    M.*
FROM
    MaxByRowNumber AS M
WHERE
    M.LastModifiedDateRanking = 1

根据您的需要,您可能想在ORDER BY中添加另一列以解开最近更新的日期。

答案 2 :(得分:0)

一种方法是使用CTE

with cte as 
(
  select Id,
  max(LastModifiedDate) LastModifiedDate
  FROM [MyServer].[Database].[Table]
  group by Id
)
select t.*, c.LastModifiedDate
from [MyServer].[Database].[Table] t join cte c on t1.id = cte.id

答案 3 :(得分:0)

我一经发布便立即弄清了这一点。我只是对使用窗口函数的正确方法感到困惑。

SELECT [Id]
  ,LastModifiedDate
  ,Row_Number() over (Partition by Id order by LastModifiedDate DESC) as rn
  ,[FirstName]
  ,[LastName]
  ,[Company]
  ,[Title]     
FROM [MyServer].[Database].[Table] as C
where rn = 1

我想做的是:

,Row_Number() over (Partition by Id order by MAX(LastModifiedDate) DESC) as rn

但是MAX没有意义,因为它是DESC

答案 4 :(得分:0)

您可以使用subquery

select t.*
from table t
where LastModifiedDate = (select max(t1.LastModifiedDate) 
                          from table t1 
                          where t1.id = t.id
                         );