Sql 在联接查询中按最新日期排序

Sql 在联接查询中按最新日期排序,sql,sql-server,Sql,Sql Server,我在MSSQL中有一个需要修改的查询,但我无法使其正常工作。现在的查询如下: SELECT Computer.Id AS ComputerId, Concat(HardDisk.Id, ' ') disks FROM Computer LEFT JOIN HardDisk ON Computer.Id = HardDisk.ComputerId LEFT JOIN DiskOperationLog ON DiskOperati

我在MSSQL中有一个需要修改的查询,但我无法使其正常工作。现在的查询如下:

SELECT Computer.Id AS ComputerId, 
        Concat(HardDisk.Id, ' ') disks
        FROM Computer 
        LEFT JOIN HardDisk ON Computer.Id = HardDisk.ComputerId 
        LEFT JOIN DiskOperationLog ON DiskOperationLog.HardDiskId = HardDisk.Id
我还需要它在表DiskOperationLog中检查EndTime列,如果存在具有相同硬盘.Id的两个DiskOperationLog列,则只需要选择具有最新日期的DiskOperationLog。这是你能做的吗?我怀疑可以使用maxDiskOperationLog.EndTime来完成,但我无法将其正确地包含在我的选择中

非常感谢您的帮助

我还需要它在表DiskOperationLog中检查EndTime列,如果存在具有相同硬盘.Id的两个DiskOperationLog列,则只需要选择具有最新日期的DiskOperationLog

您的查询似乎未使用DiskOperationLog-不用于筛选查询使用左连接,不选择任何列。让我假设这是问题中的疏忽

在SQL Server中,执行所需操作的最简单方法是使用外部应用:

APPLY实现了一个横向连接,它非常类似于一个相关子查询,但有以下区别:

逻辑在FROM子句中。 可以返回多个列。 可以返回多行。
您可以使用ROW\u NUMBER子句。您可能希望按hardisk.Id进行分区,并按DiskOperationLog.EndTime降序排序

With Qry1 As (
    SELECT      Computer.Id AS ComputerId, 
                Concat(HardDisk.Id, ' ') disks,
                DiskOperationLog.EndTime,
                ROW_NUMBER() OVER(PARTITION BY HardDisk.Id ORDER BY DiskOperationLog.EndTime DESC) As Seq
    FROM        Computer 
    LEFT JOIN   HardDisk 
    ON          Computer.Id = HardDisk.ComputerId 
    LEFT JOIN   DiskOperationLog 
    ON          DiskOperationLog.HardDiskId = HardDisk.Id
)
SELECT      Computer.Id AS ComputerId, 
            Concat(HardDisk.Id, ' ') disks,
            DiskOperationLog.EndTime,
FROM        Qry1
WHERE       Seq = 1

顺便说一句,如果您试图在第2列中获得逗号分隔的磁盘号列表,那么这绝对不是解决问题的方法。

请提供示例数据和所需结果。
With Qry1 As (
    SELECT      Computer.Id AS ComputerId, 
                Concat(HardDisk.Id, ' ') disks,
                DiskOperationLog.EndTime,
                ROW_NUMBER() OVER(PARTITION BY HardDisk.Id ORDER BY DiskOperationLog.EndTime DESC) As Seq
    FROM        Computer 
    LEFT JOIN   HardDisk 
    ON          Computer.Id = HardDisk.ComputerId 
    LEFT JOIN   DiskOperationLog 
    ON          DiskOperationLog.HardDiskId = HardDisk.Id
)
SELECT      Computer.Id AS ComputerId, 
            Concat(HardDisk.Id, ' ') disks,
            DiskOperationLog.EndTime,
FROM        Qry1
WHERE       Seq = 1