SQL使用Rank和Row_Number与Order by

时间:2018-09-09 04:08:14

标签: sql sql-server window-functions row-number

我正在使用SSMS 2018,并具有与此类似的表:

<div class="form-group">
    <label for="name">Endpoint Name</label>
    <input type="text" placeholder="Endpoint Name" name="name" [(ngModel)]="name" required>
</div>

<div ngModelGroup="connection">
<div class="form-group">
    <label for="wavefrontInstance">Wavefront Host/IP</label>
    <input type="text" placeholder="https://0.0.0.0" name="wavefrontInstance" [(ngModel)]="wavefrontInstance" required>
</div>
<div class="for-group">
    <label for="connection.waveFrontProxyPort">Wavefront Proxy Port</label>
    <input type="number" placeholder="2878" name="waveFrontProxyPort" [(ngModel)]="waveFrontProxyPort" required>
</div>
</div>

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 的最新DxDxDate可以使用,但是,如果有类似上面的领带(2015年10月1日),我希望最新的领带可以基于Row_number

在这种情况下,我希望结果是:

CreateDate

我相信我可以在此查询中使用DocID Dx DxDate CreateDate 6018 ADHD 10/1/2015 10/9/2015 18:14 ,但不确定如何使用。到目前为止,这是我的查询:

Rank()

我相信我正在寻找类似的东西:

  

排序依据(案例,当rank1 = rank1时创建日期,否则DxDate结束)DESC

当然这是行不通的,因为我需要某种迭代并且不能将其放在子查询中。 我也不能使用任何派生表来解决此问题。这可能吗? 非常感激!

3 个答案:

答案 0 :(得分:2)

您应该可以将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;

上述查询与您所想到的相比,唯一的重大变化是DocID将比较两个具有相同DxDateCreateDate值的记录,以确定哪个一个真的是“第一”。

Demo

注意:在您的演示中,两条记录具有不同的 DocID值,但我认为您希望它们具有相同的值。在上面的演示链接中,我将两个记录更改为具有相同的DocID值,并且逻辑起作用。

答案 1 :(得分:0)

您只能使用ROW_NUMBER(),并且可以使用ORDER BY CreateDate。

ROW_NUMBER()超过(按DocID排序或按CreateDate DESC排序)为rownum1

答案 2 :(得分:0)

根据您的示例数据,只需要在下面的查询中

  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