SQL для сравнения значений полей в наборе строк, сгруппированных по уникальному идентификатору на группу

Цель состоит в том, чтобы запросить изменения имени в таблице аудита. Я только хочу выбрать строки, которые содержат изменение имени.

Для каждого обновления записи создаются 2 строки - до обновления и после обновления.

Я хочу сравнить значения в KEYNAME за уникальный auditkey, Итак, я хотел бы сгруппировать эти 2 топ-записи по уникальным auditkey в строках 80 и 81. Затем я хотел бы сравнить значения в строках 80 и 81. Я бы хотел выбрать только вторую строку (afterupdate), если значения разные.

Я использую SQL Server 2008.

Я думаю, я могу сделать что-то вроде:

select distinct AUDITKEY, KEYNAME 
from dbo.CONSTITUENTAUDIT

во временную таблицу, затем запустите счетчик для столбца audkey внутри временной таблицы. Все, что имеет счет> 1 - это то, что я ищу.

2 ответа

Решение

Вы можете JOIN стол к себе (самостоятельное соединение). Так что просто извлекайте записи, которые имеют AUDITTYPE = 1 (после обновления) с другим KEYNAME чем запись с тем же AUDITKEY но с AUDITTYPE = 0

SQL Fiddle

Настройка схемы MS SQL Server 2008:

CREATE TABLE Table1
    ([AUDITKEY] varchar(36), [AUDITTYPE] int, [AUDITTYPECODE] varchar(13), [KEYNAME] varchar(9))
;

INSERT INTO Table1
    ([AUDITKEY], [AUDITTYPE], [AUDITTYPECODE], [KEYNAME])
VALUES
    ('12345678-1234-1234-1234-123456789012', 0, 'before update', 'BLABLABLA'),
    ('12345678-1234-1234-1234-123456789012', 1, 'after update', 'BLABLABLA'),
    ('22345678-1234-1234-1234-123456789012', 0, 'before update', 'BLABLA'),
    ('22345678-1234-1234-1234-123456789012', 1, 'after update', 'ALBALB')
;

Запрос 1:

SELECT T2.AUDITKEY, T2.KEYNAME
FROM Table1 T1
INNER JOIN Table1 T2 ON T1.AUDITKEY = T2.AUDITKEY AND
                        T1.AUDITTYPE = 0 AND T2.AUDITTYPE = 1 AND
                        T1.KEYNAME <> T2.KEYNAME

Результаты:

|                             AUDITKEY | KEYNAME |
|--------------------------------------|---------|
| 22345678-1234-1234-1234-123456789012 |  ALBALB |

Вы можете присоединиться к таблице на себя:

SELECT a.* FROM dbo.CONSTITUENTAUDIT a
JOIN dbo.CONSTITUENTAUDIT b 
    ON a.AUDITKEY = b.AUDITKEY and a.AUDITTYPE <> b.AUDITTYPE 
        and a.AUDITTYPE = 'AFTER UPDATE' and a.KEYNAME <> b.KEYNAME

это должно работать так, как вы просите.

Другие вопросы по тегам