2016-03-01 75 views
0

我有2个相同的源表,但只有不同的值。两个表都没有任何主键。通过比较2个相同的表选择最新记录

我想获得最新的记录了基于这些条件的2个表:

  1. 应该比较两者的Test1和Test2的,并基于最新的扫描日期和BIOSID它应该返回的值。
  2. 如果BiosID为空,它应该检查最新的扫描日期和SerialNumber。
  3. 如果BiosID和SerialNumber都为空,它应该检查主机名。

测试1:

MachineID | Scandate | Account | BiosID  | Serial number | Hostname | 
1000  | 10-01-2016 | A  | Abcd1111 | null   |  null | 
1001  | 11-01-2016 | B  | null  | 7890   |  XYZ | 
1002  | 12-02-2016 | C  | null  | null   |  PQR | 
1003  | 13-01-2016 | D  | null  | null   |  DEF | 

的Test2:

MachineID | Scandate | Account | BiosID | Serial number | Hostname | 
1000  | 10-02-2016 |   W | Abcd1111|   1234 |  ABC | 
1001  | 11-02-2016 |   X | null |   7890 |  null | 
1002  | 12-01-2016 |   Y | null |   null |  null | 
1003  | 13-02-2016 |   Z | null |    null|  DEF | 

结果表应该是 Test3的:

结果:

MachineID | Scandate | Account | BiosID | Serial number | Hostname | 
1000  | 10-02-2016 |   W | Abcd1111 |   1234 |  ABC | 
1001  | 11-02-2016 |   X | Null  |   7890 |  null | 
1002  | 12-02-2016 |   C | null  |   null |  PQR | 
1003  | 13-02-2016 |   Z | null  |   null |  DEF | 

以前,我只写了一个代码来检查最新的扫描和BiosID。

查询:

WITH Combined As(
SELECT MachineID,LastHWScan,Account,BiosID,SerialNumber,HostName 
FROM TEST1 

UNION 
SELECT MachineID,LastHWScan,Account,BiosID,SerialNumber,HostName 
FROM TEST2 
) 
, Ordered AS(
SELECT MachineID,LastHWScan,Account,BiosID,SerialNumber,HostName, 
ROW_NUMBER() OVER(PARTITION BY BiosID ORDER BY LastHWScan DESC) AS rn 
FROM Combined 
) 

INSERT INTO TEST3(MachineID,LastHWScan,Account,BiosID,SerialNumber,HostName) 
SELECT MachineID,LastHWScan,Account,BiosID,SerialNumber,HostName FROM Ordered 
WHERE rn=1 

但如果BIOSID是空的,我不能得到所要求的结果。 所以任何人都可以帮我吗? 在此先感谢。

+1

你可能已经改变了分配问题的格式! – FallAndLearn

回答

0

你可以尝试像

ROW_NUMBER() OVER(PARTITION BY BiosID ORDER BY LastHWScan DESC) as rn 
, ROW_NUMBER() OVER(ORDER BY LastHWScan, SerialNumber DESC) as rn2 
, ROW_NUMBER() OVER(ORDER BY Hostname DESC) as rn3 

INSERT INTO TEST3(MachineID,LastHWScan,Account,BiosID,SerialNumber,HostName) 
    SELECT MachineID,LastHWScan,Account,BiosID,SerialNumber,HostName FROM Ordered 
    WHERE (BiosID IS NOT NULL AND rn = 1) 
    OR (BiosID IS NULL AND SerialNumber IS NOT NULL AND rn2 = 1) 
    OR (BiosID IS NULL AND SerialNumber IS NULL AND rn3 = 1) 
+0

谢谢artm。它帮助我.. – HelpSeeker

+0

@HelpSeeker你最终使用的解决方案是什么? – artm