选择最新记录

问题描述 投票:0回答:4

我正在尝试将3行聚合到一行(选择最新记录)。但我仍然得到3条记录而不是1条。有什么想法? ** SQL Server **

select [TotalTechPremium] From Premiumfile
where [TimeDate Stamp] = (select Max([TimeDate Stamp]) 
                          From Premiumfile
                          where PolicyNo = '47-ZCA-000276-02'
                         );
sql sql-server max
4个回答
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
投票

以下是使用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

如果您设置包括实际执行计划并执行上述操作,您可以看到执行计划是相同的。


-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;

-1
投票

如果该查询输出3条记录,则表示PremiumFile表中有3条记录,其时间戳等于该策略号的最大时间戳。也许您忘记添加一个额外的地方,您可以通过该政策编号再次过滤。或者您可以通过以下方式替换您的查询:

select top 1 TotalTechPremium
from Premiumfile
where PolicyNo='47-ZCA-000276-02'
order by Timestamp desc
© www.soinside.com 2019 - 2024. All rights reserved.