代码之家  ›  专栏  ›  技术社区  ›  Mark Robinson

返回具有最新时间戳和多个(或全部)列的distinct项

  •  1
  • Mark Robinson  · 技术社区  · 15 年前

    我有一个由触发器填充的表传递历史记录:

    id(guid)  order_number  delivery_number  haulier    timestamp(getdate())
    
              1             1234             haulier1   2009-10-08 8:34:00
              2             1235             haulier1   2009-10-09 9:15:00
              1             1234             haulier2   2009-10-10 9:20:00
    

    我希望返回所有列,但我只希望看到具有最新时间戳的唯一交货编号,因此我希望返回的数据为:

              1             1234             haulier2   2009-10-10 9:20:00
              2             1235             haulier1   2009-10-09 9:15:00
    

    到目前为止,我已经尝试了在这个站点上发布的每一种可能和响应组合,它们要么没有提供我需要的结果,要么期望我是明智的,使用的是一个增量ID,而不是我使用的guid(现在触发器有一周的数据,我真的不想转储它),要么期望SQL服务R 2005或更高。

    这将在SQL Server 2000上运行。

    事先谢谢, 作记号

    2 回复  |  直到 15 年前
        1
  •  2
  •   Peter Radocchia    15 年前

    我不喜欢这里有重复的可能。具有相同交货号的两行可能具有相同的时间戳。考虑到交付的频率和应用程序的行为,这可能是不太可能的,但我不想为了正确性而依赖于它。

    此版本使用Top1并允许任意数量的连接断路器:

    select * from delivery_history a
    where id = (
      select top 1 id 
      from delivery_history b
      where a.delivery_number = b.delivery_number
      order by b.timestamp desc [, tie breaking col1, col2, ... colN]
      )
    
        2
  •  1
  •   manji    15 年前
    SELECT order_number, delivery_number, haulier, timestamp
      FROM delivery_history dh1
     WHERE timestamp = (SELECT max(dh2.timestamp)
                          FROM delivery_history dh2
                         WHERE dh2.delivery_number = dh1.delivery_number)