【问题标题】:Pairing Send and Receive Data Rows in SQL在 SQL 中配对发送和接收数据行
【发布时间】:2016-02-02 20:35:01
【问题描述】:

在 SQL 中配对数据行时遇到问题,以识别项目何时发出但未返回。发送和接收条目在不同的行上,并且两者之间存在数据关系,所以我认为这是可行的,我只是对解决方案感到难过。 Module 和 User 应该将事务绑定在一起,但是还有一个“batch”列可用于进一步确保事务的唯一性

示例表结构:

 MODULE         USER       EVENTDTTM                ACTION     Batch
 --------------------------------------------------------------------
 MODULE1        USERB      2016-01-09 13:00:00      SENT        001
 MODULE1        USERB      2016-01-09 13:01:00      RECEIVED    001
 MODULE2        USERA      2016-01-09 13:00:00      SENT        001
 MODULE2        USERA      2016-01-09 13:01:00      RECEIVED    001
 MODULE1        USERA      2016-01-09 13:03:00      SENT        002
 MODULE2        USERB      2016-01-09 13:04:00      SENT        002

我尝试在表本身上进行连接,但我只看到配对数据(大量重复)...我找不到发送项目但没有配对的场景已找到收据。

【问题讨论】:

  • 这是一个难题。嵌套组合呢?
  • @Gordon 我在该示例中看到了 ModuleUserBatch 的独特组合。

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


【解决方案1】:
select *
from
    (select * from T where Action = 'SENT') s
    left outer join
    (select * from T where Action = 'RECEIVED') r
        on r.Module and s.Module and r.User = s.User and r.Batch = s.Batch

从有限数量的样本数据看来,您可以通过共同的moduleuserbatch 来唯一地确定匹配项。我不确定您为什么在查询中提出重复项。唯一的其他问题似乎是使用外部连接来保留还没有“接收”的“发送”。

我认为您仍然想要结果中的所有内容。如果您只想要未配对的场景,请添加:

where r.Module is null

【讨论】:

  • 其实……这是正确的答案。我最初标记为正确的响应有效......但前提是只有一个发送/接收对的实例不匹配......您提供的解决方案返回所有发送实例而没有收据。再次感谢。
【解决方案2】:
SELECT
    T1.module,
    T1.user,
    T1.eventdttm,
    T1.action,
    T1.batch
FROM
    My_Table T1
WHERE
    T1.action = 'SENT' AND
    NOT EXISTS
        (
        SELECT *
        FROM My_Table T2
        WHERE
            T2.module = T1.module AND
            T2.user = T1.user AND
            T2.batch = T1.batch AND
            T2.action = 'RECEIVED'
        )

【讨论】:

  • 成功了。非常感谢,太完美了。它只返回有“已发送”但没有匹配已接收的行。再次感谢。
猜你喜欢
  • 2010-12-22
  • 2012-04-12
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
相关资源
最近更新 更多