我希望每个不同的ID为MAX(Date)
。这很简单:
SELECT
Id,
MAX(LastModifiedDate)
FROM
[MyServer].[Database].[Table]
GROUP BY
Id;
但是我还需要包括其他列,例如名字,姓氏,公司等。
不能聚合,并且如果我将它们放在GROUP BY
子句中将不起作用,因为这样它会返回我不想要的行。
答案 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
);