【问题标题】:Select unique value with most recent date, grouping by another value选择具有最近日期的唯一值,按另一个值分组
【发布时间】:2020-08-06 11:42:38
【问题描述】:

我有两个连接表,一个列出设备 ID,另一个列出最近库存收集的 ID 和日期。使用下面的查询我会看到类似的东西:

SELECT d.DeviceName, d.DeviceID, r.InvDate FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID
  • DeviceName DeviceID InvDate
  • 计算机 1 101 22/4/2020
  • 计算机 2 102 20/4/2020
  • 计算机 3 103 19/4/2020
  • 计算机 4 104 5/3/2020
  • 计算机 4 105 22/4/2020
  • 计算机 5 106 20/4/2020

如您所见,有些名称可以重复。

如何提取唯一名称列表(编辑:连同他们的 ID)和最近的库存日期? 在一些完美的世界里,我会在下面做

SELECT d.DeviceID, MAX(r.InvDate) FROM Device d
JOIN Report r on d.DeviceID = r.DeviceID
GROUP BY d.DeviceName

【问题讨论】:

  • 如果你想要名字,我会考虑选择 d.DeviceName 等

标签: sql sql-server tsql join greatest-n-per-group


【解决方案1】:

我会为此推荐apply

SELECT d.DeviceID, d.DeviceName, r.*
FROM Device d OUTER APPLY
     (SELECT TOP (1) r.*
      FROM report r
      WHERE d.DeviceID = r.DeviceID
      ORDER BY r.InvDate DESC
     ) r;

请注意,这比使用ROW_NUMBER()(通常)更有效,但它是横向连接的一个很好的介绍。

【讨论】:

    【解决方案2】:

    您也可以通过row_number() 进行此操作。

    select
        DeviceName,
        DeviceID,
        InvDate
    from
    (
        select
            DeviceName,
            d.DeviceID,
            InvDate,
            row_number() over (partition by DeviceName order by InvDate desc) as rnk
        from device
        join report r
        on d.DeviceID = r.DeviceID
    ) vals
    where rnk = 1
    order by    
        DeviceID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      相关资源
      最近更新 更多