2016-03-01 93 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