2017-04-21 120 views
0

查阅编辑BELOW从多个列中选择不同的值与多个表

我试图建立在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: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行):

Serial FW_Ver DeviceName UserName LastUpload   LastRecord 
12345678 772  Test1  User1  2016-02-22 17:30:18 2014-01-01 16:19:06 
12348678 891  Test1  User1  2016-02-22 17:30:31 2015-02-16 15:41:56 
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 

正如你所看到的,我得到的最新日期时间为每个特定的设备它使用的固件版本。我不希望这样,我只想从最新文件中列出最新的日期时间,而不考虑固件版本。

这里是我的查询迄今:

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 (PARTITION BY d.serial) AS FW_Ver,但返回,然后只显示为指定设备的最高数量的相同数量的结果和固件版本(998×3而不是上表中排在前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 

现在的问题是,与WHERE RN = 1使得到返回任何NULL值,而我需要那些被显示。删除WHERE可以获得与以前完全相同的结果列表。我在哪里可以移动/修改WHERE RN = 1子句,以便返回NULL值?

+0

我很想念示例数据中的“说明”列。那里不是问题吗? – TcKs

+0

我的歉意,我把它从结果中删除,因为它们都是空白的,无论如何不会影响我的结果。主帖被更新。 – Trevor

+0

更新了主帖,以澄清我的问题,因为它之前并不简明。 – Trevor

回答

1

我得到它的工作通过下面的查询:

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 

所有我在我以前的编辑加了OR t.CreatedOn is NULL其中包括NULL值,因为我想要的。将ROW_NUMBER() OVER PARTITIONWHERE RN = 1结合使用可以避免显示较早的固件版本,因为子查询只会返回给定设备的最高版本固件(如由PARTITION BY DeviceId ORDER BY Firmware DESC指定),并且随后仅返回最新的固件版本上传和记录日期。