我有2个相同的源表,但只有不同的值。两个表都没有任何主键。通过比较2个相同的表选择最新记录
我想获得最新的记录了基于这些条件的2个表:
- 应该比较两者的Test1和Test2的,并基于最新的扫描日期和BIOSID它应该返回的值。
- 如果BiosID为空,它应该检查最新的扫描日期和SerialNumber。
- 如果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是空的,我不能得到所要求的结果。 所以任何人都可以帮我吗? 在此先感谢。
你可能已经改变了分配问题的格式! – FallAndLearn