我正在使用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
。 但是,如果有像上面(10/1/2015(这样的平局,Row_number
会起作用,我希望最近的基于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
我相信我正在寻找类似的东西:
排序方式(当 rank1=rank1 时,则创建日期否则 DxDate 结束( DESC
当然,这不起作用,因为我需要某种迭代并且无法将其放入子查询中。 我也不能使用任何派生表来解决此问题。这可能吗? 非常感谢!
您应该能够将ROW_NUMBER
与两层ORDER BY
子句一起使用:
SELECT DocID, Dx, DxDate, CreateDate
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY DocID ORDER BY DxDate DESC, CreateDate DESC) rn
FROM DxList
) t
WHERE rn = 1;
与您所想到的查询相比,上述查询中唯一的主要变化是,CreateDate
将比较具有相同DocID
和DxDate
值的两条记录,以确定哪一个是真正的"第一条"。
演示
注意:在您的演示中,两个记录具有不同的DocID
值,但我认为您希望它们具有相同的值。 在上面的演示链接中,我已将两条记录更改为具有相同的DocID
值,并且逻辑正常工作。
您只能使用 ROW_NUMBER(( 和 ORDER BY CreateDate 它将起作用。
ROW_NUMBER(( OVER (按 DocID 顺序按 CreateDate DESC 划分( AS rownum1
根据您的示例数据只需要以下查询
SELECT top 1 *
FROM DxList
order by DxDate desc,CreateDate desc
但是根据您的描述,请按照@Tim提供的查询进行操作
在此链接中,您将找到两个查询
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=44fdd4b2e849137cebe9df837ac41a39
DocID Dx DxDate CreateDate
6018 ADHD 01/10/2015 00:00:00 09/10/2015 18:14:00