用于比较按每组唯一ID分组的行集内的字段值的SQL

时间:2015-09-29 16:25:25

标签: sql sql-server sql-server-2008

目标是查询审计表中的名称更改。我只想选择包含名称更改的行。

对于每个记录更新,将创建2行 - 更新前和更新后。 enter image description here

我想比较每个唯一KEYNAME auditkey中的值。 因此,我希望将这两个最高记录按行80和行上的唯一auditkey分组。 81.然后我想比较第80行和第81行的值。如果值不同,我只想选择第二行(afterupdate)。

我正在使用SQL Server 2008.

我以为我可以这样做:

select distinct AUDITKEY, KEYNAME 
from dbo.CONSTITUENTAUDIT

进入临时表,然后对临时表中的auditkey列运行计数。任何有计数的东西> 1是我正在寻找的。

2 个答案:

答案 0 :(得分:1)

您可以自行加入表格:

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

它应该按你提出的方式工作。

答案 1 :(得分:1)

你可以JOIN一张桌子(自我加入)。因此,只提取Product::find()->where(['metrics' => 'kg', ['<', ['quantity' => $quantity]]]) ->orWhere(['metrics'=> 'lbs', ['<', ['quantity' => $quantity * 2.2]]]) ->all(); (更新后)与AUDITTYPE = 1不同的记录,而不是具有相同KEYNAMEAUDITKEY

的记录

SQL Fiddle

MS SQL Server 2008架构设置

AUDITTYPE = 0

查询1

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')
;

<强> Results

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