SQL 使用排名和Row_Number与排序依据



我正在使用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将比较具有相同DocIDDxDate值的两条记录,以确定哪一个是真正的"第一条"。

演示

注意:在您的演示中,两个记录具有不同的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

相关内容

  • 没有找到相关文章

最新更新