【问题标题】:Query to SELECT non-repeating values from table查询从表中选择非重复值
【发布时间】:2013-12-09 17:07:09
【问题描述】:

我的表格结构如下:

ID        Name             RunDate
10001     Item 1           12/09/2013 02:11:47
10002     Item 2           12/09/2013 01:13:25
10001     Item 1           12/09/2013 01:11:37
10007     Item 7           12/08/2013 11:02:04
10001     Item 1           12/08/2013 10:25:00

我的问题是这个表将被发送到一个通讯组电子邮件,它使电子邮件如此之大,因为该表有数百行。我想要实现的是仅显示具有 DISTINCT ID 的记录,仅显示最近的 RunDate。

ID        Name             RunDate
10001     Item 1           12/09/2013 02:11:47
10002     Item 2           12/09/2013 01:13:25
10007     Item 7           12/08/2013 11:02:04

知道我该怎么做吗?我对聚合的东西不是很好,我用过 DISTINCT,但它总是把我的查询弄乱。

谢谢!

【问题讨论】:

    标签: sql-server unique distinct distinct-values


    【解决方案1】:

    按应该不同的值分组并使用max() 获取最新日期

    select id, name, max(rundate) as rundate
    from your_table
    group by id, name
    

    【讨论】:

      【解决方案2】:

      这更灵活,因为它不需要按所有列分组:

      ;WITH x AS
      (
        SELECT ID, Name, RunDate, /* other columns, */
          rn = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RunDate DESC)
        FROM dbo.TableName
      )
      SELECT ID, Name, RunDate /* , other columns */
        FROM x
        WHERE rn = 1
        ORDER BY ID;
      

      (由于Name 真的不需要分组,实际上甚至不应该在这个表中,GROUP BY 解决方案的下一个后续问题几乎总是,“我该怎么做将<column x><column y> 添加到输出中,如果它们具有不同的值并且无法添加到GROUP BY?")

      【讨论】:

      • 谢谢你!这很有帮助!不过后续问题......如果我还想输出每个组/分区下包含的总行数怎么办?有没有办法做到这一点?
      • 好的,里面加,c = COUNT(*) OVER (PARTITION BY ID),外面加,c
      猜你喜欢
      • 2018-09-30
      • 1970-01-01
      • 2016-07-21
      • 2012-08-18
      • 2019-02-10
      • 2013-04-10
      • 2021-05-27
      • 1970-01-01
      • 2012-08-07
      相关资源
      最近更新 更多