在SQL

时间:2016-02-02 20:35:01

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

在SQL中配对数据行时出现问题,以确定项目何时熄灭但未返回。发送和接收条目位于不同的行上,两者之间存在数据关系,所以我认为这是可行的,我只是对解决方案感到难过。模块和用户应该将事务联系在一起,但是还有一个“批处理”列可以用来进一步确保一个独特的事务

示例表结构:

 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

我已经尝试过在桌面上进行连接,但是我只看到配对数据(有大量重复数据)...我找不到项目发送的场景,但没有配对收据被发现。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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