【问题标题】:get only last row in each day's multiple entries in TSQL仅获取 SQL 中每天的多个条目中的最后一行
【发布时间】:2011-07-22 10:06:19
【问题描述】:

我有一张桌子,类似于:

Id        Name        EnteredOn                    Percentage
`````````````````````````````````````````````````````````````
01        person1     2011-03-09 17:29:35.683      56.29
02        person1     2011-03-09 17:29:35.731      76.29
03        person1     2011-03-09 18:15:78.683      56.29
04        person1     2011-03-10 17:29:35.683      56.29
05        person1     2011-03-10 16:29:31.683      56.29
06        person1     2011-03-11 17:29:35.683      56.29

总结上表,09天有行,10天有行>.

现在,我只想选择最新的一行 - 一行 - 每天。
(一行 9,一行 10,一行 11)

由于时间戳,我不能使用 distinct。我无法分组和使用:

CAST(CONVERT(FLOAT, EnteredOn) AS INT)

因为当我选择 EnteredOn 字段时,它抱怨它没有分组。我无法组合distinct(cast..date...),因为我无法获得正确的语法。

如何选择 - 仅姓名、EnteredOn、百分比字段与每天不同?

非常感谢。

【问题讨论】:

    标签: sql-server tsql sql-server-2008


    【解决方案1】:

    我会在这里再推荐一个技巧:

    select top 1 with ties 
        Name, EnteredOn, Percentage
    from YourTable
    order by row_number() over(partition by datediff(d, 0, EnteredOn) order by Name, EnteredOn desc)
    

    【讨论】:

      【解决方案2】:
      ;with cte as
      (
        select
          *,
          row_number() over(partition by datediff(d, 0, EnteredOn) order by EnteredOn desc) as rn 
        from YourTable
      )
      select *
      from cte  
      where rn = 1
      

      【讨论】:

      • 嗨,这确实有效,但是,我大部分都不明白,查询在做什么? esp partition - 这是做什么的?此查询是否会在大量行上减慢速度?谢谢
      • 另外,这里只考虑日期,抱歉之前没有提到,我也希望能够过滤人。
      • 添加到最后一条评论select one row per day of a particular person and particular percentage - 类似这样的......
      • @iamserious - partition by 是一种代替组子句的方式。 row_number()order by 指定的顺序为每一行递增。 partition 确定 row_number 何时应再次从 1 开始。因此,如果您还需要按Name 进行分组,则应将分区扩展到partition by datediff(d, 0, EnteredOn), Name,以此类推,以获取更多需要分组的字段。除了您应该使用此处建议的查询运行测试并选择对 您的 数据具有最佳性能的查询之外,我不能说任何关于性能的内容。
      【解决方案3】:
      SELECT Name, EnteredOn, Percentage
      FROM (  SELECT *, ROW_NUMBER() OVER(PARTITION BY CONVERT(VARCHAR(8),EnteredOn,112) ORDER BY EnteredOn DESC) Corr
              FROM YourTable) A
      WHERE Corr = 1
      

      【讨论】:

        【解决方案4】:

        1 行/天:

        SELECT t1.Name, t1.EnteredOn, t1.Percentage
          FROM table t1
          JOIN (SELECT MAX(EnteredOn) Max_EnteredOn_By_Day
                  FROM table 
                 GROUP BY convert(varchar, EnteredOn, 112)) t2
          ON t1.EnteredOn = t2.Max_EnteredOn_By_Day
        

        1 行/人/天:

        SELECT t1.Name, t1.EnteredOn, t1.Percentage
          FROM table t1
          JOIN (SELECT Name, MAX(EnteredOn) Max_EnteredOn_By_Day
                  FROM table 
                 GROUP BY Name, convert(varchar, EnteredOn, 112)) t2
          ON t1.Name = t2.Name
         AND t1.EnteredOn = t2.Max_EnteredOn_By_Day
        

        【讨论】:

        • 非常感谢您帮助我:-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-19
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多