【问题标题】:SQL to compare field values within a set of rows grouped by a unique ID per groupSQL 比较一组行中的字段值,这些行按每组的唯一 ID 分组
【发布时间】:2015-09-29 16:25:24
【问题描述】:

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

对于每次记录更新,都会创建 2 行——更新前和更新后。

我想比较 KEYNAME 中每个唯一 auditkey 中的值。 所以,我想通过第 80 行和第 81 行上的唯一 auditkey 对这两个顶级记录进行分组。然后我想比较第 80 行和第 81 行中的值。我只想选择第二行( afterupdate) 如果值不同。

我使用的是 SQL Server 2008。

我想我可以这样做:

select distinct AUDITKEY, KEYNAME 
from dbo.CONSTITUENTAUDIT

进入临时表,然后对临时表中的 auditkey 列运行计数。任何计数 > 1 的东西都是我要找的。​​p>

【问题讨论】:

  • 如果它们是真实的,您应该将这些 KeyName 清空。
  • AUDITTYPE 来自哪里?
  • 谢谢 cronos - 我现在就去做。每次记录更新时都会自动添加 AUDITTYPE。

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


【解决方案1】:

您可以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

Results

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

【讨论】:

  • 这成功了!我的想法是有缺陷的——我打算使用一个临时表,但这是一个额外的步骤。即日起自行加入。谢谢!!!!
【解决方案2】:

您可以自行加入表格:

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

它应该按照你的要求工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多