Sql server 从具有多个表的多个列中选择不同的值
请参见下面的编辑 我正在尝试在SQL Server 2012中构建一个列表,其中显示:Sql server 从具有多个表的多个列中选择不同的值,sql-server,Sql Server,请参见下面的编辑 我正在尝试在SQL Server 2012中构建一个列表,其中显示: Serial FW_Ver DeviceName UserName LastUpload LastRecord 12345678 998 Test1 User1 2016-02-22 17:31:28 2016-02-19 11:14:15 45678912 998 Test2 User5 2016-03-14 16
Serial FW_Ver DeviceName UserName LastUpload LastRecord
12345678 998 Test1 User1 2016-02-22 17:31:28 2016-02-19 11:14:15
45678912 998 Test2 User5 2016-03-14 16:24:17 2016-03-14 12:24:57
78978979 600 Test3 User12 2016-01-31 09:12:48 2016-01-30 23:49:12
45554468 NULL Test4 NULL NULL NULL
这是从同一数据库中的3个不同表构建的。设备表中的序列号都是唯一的,没有重复项,因此我希望看到所有序列号返回的结果,即使它们尚未上载任何文件。我当前的查询提供了我想要的结果,但添加了一些不需要的内容,如下所示(前3行):
如您所见,我正在获取特定设备使用的每个固件版本的最新日期时间。我不想这样,我只想从最新的文件中列出最新的日期时间,而不管固件版本如何
到目前为止,我的问题是:
SELECT d.Serial,
de.Firmware AS FW_Ver,
d.DeviceName,
MAX(de.CreatedOn) AS LastUploadedDate,
MAX(de.EventTimeStamp) AS LastRecordingDate
FROM AuroraCore.dbo.DeviceEvent AS de
RIGHT JOIN AuroraCore.dbo.Device AS d ON d.Id = de.DeviceId
GROUP BY d.Serial, de.firmware, d.DeviceName
我尝试将MAX(de.Firmware)OVER(按d.serial分区)用作FW_Ver
,但这会返回相同数量的结果,并且固件版本仅显示为给定设备的最高数字(998 x3,而不是上表顶部3行中显示的772、891和998)
如何仅从给定设备的最新文件中提取日期时间并返回相应版本的固件?我想要上传日期的优先级,然后是记录日期。谢谢
编辑1:我可以通过使用以下命令删除多余的、不需要的信息:
SELECT d.Serial,
t.Firmware AS FW_Ver,
d.DeviceName,
MAX(t.CreatedOn) AS LastUpload,
MAX(t.EventTimeStamp) AS LastRecord
FROM (
SELECT de.DeviceId,
de.Firmware,
de.CreatedOn,
de.EventTimeStamp,
ROW_NUMBER() OVER (PARTITION BY DeviceId ORDER BY Firmware DESC) AS RN
FROM AuroraCore.dbo.DeviceEvent AS de
) AS t
RIGHT JOIN AuroraCore.dbo.Device AS d ON d.Id = t.DeviceId
WHERE RN = 1
GROUP BY d.serial, t.Firmware, d.DeviceName
现在的问题是,对于
,其中RN=1
不会返回任何NULL
值,而我需要显示这些值。删除WHERE
将获得与以前相同的精确结果列表。我在哪里可以移动/调整Where RN=1
子句,以便NULL
值也被返回?我通过以下查询得到它:
SELECT d.Serial,
t.Firmware AS FW_Ver,
d.DeviceName,
MAX(t.CreatedOn) AS Upload,
MAX(t.EventTimeStamp) AS Record
FROM (
SELECT de.DeviceId,
de.Firmware,
de.CreatedOn,
de.EventTimeStamp,
ROW_NUMBER() OVER (PARTITION BY DeviceId ORDER BY Firmware DESC) AS RN
FROM AuroraCore.dbo.DeviceEvent AS de
) AS t
RIGHT JOIN AuroraCore.dbo.Device AS d ON d.Id = t.DeviceId
WHERE RN = 1 OR t.CreatedOn is NULL
GROUP BY d.serial, t.Firmware, d.DeviceName
我在之前的编辑中添加的全部内容是
或t.CreatedOn为NULL
,其中包含了我想要的NULL值。将分区上的行号()与一起使用,其中RN=1
是去除显示为子查询的较旧固件版本的方法,只会返回固件的最高版本(由按设备划分ID顺序按固件描述指定)对于给定的设备,随后仅为上载和记录日期的最新日期时间 示例数据中缺少“描述”列。这不是问题吗?很抱歉,我从结果中删除了它,因为它们都是空白的,不会影响我的结果。主帖子更新了。更新了主帖子以澄清我的问题,因为它以前并不简洁。
SELECT d.Serial,
t.Firmware AS FW_Ver,
d.DeviceName,
MAX(t.CreatedOn) AS Upload,
MAX(t.EventTimeStamp) AS Record
FROM (
SELECT de.DeviceId,
de.Firmware,
de.CreatedOn,
de.EventTimeStamp,
ROW_NUMBER() OVER (PARTITION BY DeviceId ORDER BY Firmware DESC) AS RN
FROM AuroraCore.dbo.DeviceEvent AS de
) AS t
RIGHT JOIN AuroraCore.dbo.Device AS d ON d.Id = t.DeviceId
WHERE RN = 1 OR t.CreatedOn is NULL
GROUP BY d.serial, t.Firmware, d.DeviceName