选择最新记录

时间:2018-03-06 16:35:43

标签: sql sql-server max

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

select [TotalTechPremium] From Premiumfile
where [TimeDate Stamp] = (select Max([TimeDate Stamp]) 
                          From Premiumfile
                          where PolicyNo = '47-ZCA-000276-02'
                         );

4 个答案:

答案 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