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
Настройка схемы 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
это должно работать так, как вы просите.