Sql 在联接查询中按最新日期排序
我在MSSQL中有一个需要修改的查询,但我无法使其正常工作。现在的查询如下: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
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