我在表中有以下数据(我正在使用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
我的想法是使用几个子查询来获取设备记录。请帮助您了解获得上述结果的一些想法。提前谢谢。
答案 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
这个想法是为
的每一行添加一个rownumberLog ID
NULL
日期现在需要的是从结果集中选择此rownumber = 1的所有记录。