SQL查询基于最大日期或最大日志ID

时间:2012-11-12 04:54:19

标签: sql-server-2008-r2

我在表中有以下数据(我正在使用SQL Server 2008R2):

客户代码,设备到期日期,设备名称,日志ID

S001, NULL, Dvc A, 1
S002, NULL, Dvc B, 2
S002, NULL, Dvc A, 3
S003, 2010-01-01, Dvc A, 4
S004, 2011-06-25, Dvc B, 5
S004, 2012-02-10, Dvc A, 5

Log ID列基于运行编号。

我想根据以下标准为每个客户代码选择一条记录:
- 如果设备到期日期不为空,则采用最新日期为
的记录 - 如果所有到期日期均为空,则采用最新记录(最大日志ID)

因此,所选记录将是:

Customer Code, Device Expiry Date, Device Name, Log ID
S001, NULL, Dvc A, 1
S002, NULL, Dvc A, 3
S003, 2010-01-01, Dvc A, 4
S004, 2012-02-10, Dvc A, 5

查询的输出将进一步与主客户代码连接:

Customer Code, Member Type
S001, Silver
S002, Gold
S003, Silver
S004, Silver
S005, Gold

加入后,最终结果为:

Customer Code, Member Type, Device Expiry Date, Device Code
S001, Silver, NULL, Dvc A
S002, Gold, NULL, Dvc A
S003, Silver, 2010-01-01, Dvc A
S004, Silver, 2012-02-10, Dvc A
S005, Gold, NULL, NULL

我的想法是使用几个子查询来获取设备记录。请帮助您了解获得上述结果的一些想法。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下(未经测试)

;WITH q AS (
  SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY [Customer Code] ORDER BY [Log ID] DESC, CASE WHEN ISNULL([Device Expiry Date]) THEN 0 ELSE [Device Expiry Date]) END DESC)
  FROM    Devices
)
SELECT  *
FROM    q
WHERE   rn = 1

这个想法是为

的每一行添加一个rownumber
  • 为每位客户重置
  • 以最大的Log ID
  • 开头
  • 并对具有NULL日期
  • 的记录使用虚拟日期

现在需要的是从结果集中选择此rownumber = 1的所有记录。