我试图将3行聚合到一行(选择最新记录)。但我仍然得到3条记录而不是1条。有什么想法? ** SQL Server **
select [TotalTechPremium] From Premiumfile
where [TimeDate Stamp] = (select Max([TimeDate Stamp])
From Premiumfile
where PolicyNo = '47-ZCA-000276-02'
);
答案 0 :(得分:3)
在询问T-SQL问题时,样本数据和预期结果也非常重要。
由于您没有提供此信息,这是一种猜测,但获取“最新”记录的常用方法是使用CTE和ROW_NUMBER
。示例查询如下所示:
WITH CTE AS(
SELECT [YourColumns]
ROW_NUMBER() OVER (PARTITION BY [RelevantColumns] ORDER BY [TimestampColumn] DESC) AS RN
FROM [YourTable])
SELECT [YourColumns]
FROM CTE
WHERE RN = 1;
如果这没有帮助,请查看关于如何发布T-SQL问题的论坛礼仪上的http://www.sqlservercentral.com/articles/Best+Practices/61537/。
答案 1 :(得分:1)
以下是使用ROW_NUMBER()
create table #t (id1 int, id2 int)
insert into #t
select 1,1 union
select 1,2 union
select 2,1 union
select 2,2
select * from #t
;WITH CTE AS(
SELECT id1,
ROW_NUMBER() OVER (PARTITION BY id2 ORDER BY id1 DESC) AS RN
FROM #t)
SELECT id1
FROM CTE
WHERE RN = 1;
select id1 from (
SELECT id1,
ROW_NUMBER() OVER (PARTITION BY id2 ORDER BY id1 DESC) AS RN
FROM #t
) z
where rn = 1
drop table #t
如果您设置包括实际执行计划并执行上述操作,您可以看到执行计划是相同的。
答案 2 :(得分:-1)
您有多个具有相同时间戳的记录。
这可能会有所帮助:
select pf.TotalTechPremium
From Premiumfile pf
where pf.PolicyNo = '47-ZCA-000276-02'
pf.[TimeDate Stamp] = (select Max(pf2.[TimeDate Stamp])
From pf2.Premiumfile
where pf2.PolicyNo = pf.PolicyNo
);
但如果你想要一行,我会这么做:
select top (1) pf.TotalTechPremium
From Premiumfile pf
where pf.PolicyNo = '47-ZCA-000276-02'
order by pf.[TimeDate Stamp] desc;
答案 3 :(得分:-1)
如果该查询输出3条记录,则表示PremiumFile表中有3条记录,其时间戳等于该策略号的最大时间戳。 也许您忘记添加一个额外的地方,您可以通过该政策编号再次过滤。 或者您可以通过以下方式替换您的查询:
select top 1 TotalTechPremium
from Premiumfile
where PolicyNo='47-ZCA-000276-02'
order by Timestamp desc