代码之家  ›  专栏  ›  技术社区  ›  katy89

选择最新记录

  •  0
  • katy89  · 技术社区  · 7 年前

    我正在尝试将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 回复  |  直到 7 年前
        1
  •  3
  •   Thom A    7 年前

    在询问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;
    

    如果这没用,看看 http://www.sqlservercentral.com/articles/Best+Practices/61537/ 关于如何发布T-SQL问题的论坛礼仪。

        2
  •  1
  •   TDP    7 年前

    这里有两种不同的使用方法 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
    

    如果设置“包括实际执行计划”并执行上述内容,则可以看到执行计划是相同的。

        3
  •  -1
  •   Gordon Linoff    7 年前

    您有多条具有相同时间戳的记录。

    这可能有助于:

    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;
    
        4
  •  -1
  •   James    7 年前

    如果该查询输出3条记录,则意味着PremiumFile表中有3条记录的时间戳等于该策略编号的最大时间戳。 也许您忘记了添加一个额外的位置,在那里您可以再次按该策略编号进行筛选。 或者,您可以将查询替换为:

    select top 1 TotalTechPremium
    from Premiumfile
    where PolicyNo='47-ZCA-000276-02'
    order by Timestamp desc