2

我在表中有以下数据(我使用的是 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

日志 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

我想到的是使用几个子查询来获取设备记录。请提供一些关于获得上述结果的想法。先感谢您。

4

1 回答 1

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

这个想法是为每一行添加一个行号

  • 为每个客户重置
  • 从最大的开始Log ID
  • 并对那些有日期的记录使用虚拟NULL日期

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

于 2012-11-12T09:29:11.170 回答