【发布时间】:2019-02-13 21:53:23
【问题描述】:
我正在使用 SSMS 2018 并且有一个类似于此的表:
CREATE TABLE DxList (DocID INT, Dx VARCHAR(255), DxDate DATE, CreateDate DATETIME);
INSERT INTO DxList (DocID, Dx, DxDate, CreateDate)
VALUES (6018, 'OSDD', '10/01/2015', '10/09/2015 12:27');
INSERT INTO DxList (DocID, Dx, DxDate, CreateDate)
VALUES (6018, 'ADHD', '10/01/2015', '10/09/2015 18:14');
SELECT *
FROM DxList
DocID Dx DxDate CreateDate
6018 OSDD 10/1/2015 10/9/2015 12:27
6018 ADHD 10/1/2015 10/9/2015 18:14
我想根据DxDate 获取最新的Dx。 Row_number 会起作用,但是,如果有像上面那样的平局(2015 年 10 月 1 日),我希望最近的平局基于 CreateDate。
在这种情况下,我希望我的结果是:
DocID Dx DxDate CreateDate
6018 ADHD 10/1/2015 10/9/2015 18:14
我相信我可以在此查询中使用Rank(),但我不确定如何使用。到目前为止,这是我的查询:
SELECT DISTINCT
DocID,
Dx,
DxDate,
CreateDate,
rownum1,
rank1
FROM (SELECT
DocID,
Dx,
DxDate,
CreateDate,
RANK() OVER (PARTITION BY DocID ORDER BY DxDate DESC) AS rank1,
ROW_NUMBER() OVER (PARTITION BY DocID ORDER BY DxDate DESC) AS rownum1
FROM DxList) b
WHERE rownum1 = 1
我相信我正在寻找类似的东西:
Order By (Case When rank1=rank1 then CreateDate else DxDate End) DESC
当然这不起作用,因为我需要某种迭代并且不能将其放入子查询中。 我也不能使用任何派生表来解决这个问题。这可能吗? 非常感激!
【问题讨论】:
-
我认为您的示例输出是错误的,因为 DocID 不同,但根据您的描述,它会是相同的
标签: sql sql-server window-functions row-number