2016-03-01 8 views
0

У меня есть две одинаковые исходные таблицы с одинаковыми столбцами, но только значения разные. Обе таблицы не имеют первичных ключей.Выберите Последние записи, сравнив 2 идентичные таблицы

Я хочу, чтобы получить последние записи из этих 2-х таблиц, основанных на этих условиях:

  1. следует сравнить как Test1 и test2 и на основании последней даты сканирования и BiosID она должна возвращать значение.
  2. Если BiosID имеет значение NULL, он должен проверить дату последнего сканирования и SerialNumber.
  3. Если оба BiosID и SerialNumber равны null, он должен проверить имя хоста.

TEST1:

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

Спасибо, арт. Это помогло мне .. – HelpSeeker

+0

@HelpSeeker Что вы нашли в своем решении? – artm