SQL - 如何查找两行之间缺少值的条目

问题描述 投票:0回答:2

我们正在使用Presto SQL。我花了好几个小时试图搜索这个问题的答案,但找不到答案,搜索起来相当困难。解决这个问题打开了解决许多问题的大门。

我需要编写一个查询,尝试查找存在REQUEST_CANCEL和CHARGED但缺少CANCEL_ACCOUNT的所有条目。

在取消取消后,应始终收取取消帐户的费用。

表名:CUSTOMER_INFO

|DATE_TIME|CUST_ID |ACTION        |
|20180726 |1234    |CHARGED       |
|20180726 |1234    |CANCEL_ACCOUNT|
|20180726 |1234    |REQUEST_CANCEL|

所有这些值都存在于同一个表中。这是我到目前为止所拥有的。

SELECT *
FROM
    (SELECT *
    FROM CUSTOMER_INFO
        WHERE 
        DATE_TIME = 20180726
        AND ACTION = REQUEST_CANCEL) as a
JOIN
    (SELECT *
    FROM CUSTOMER_INFO
    WHERE
    DATE_TIME = 20180726
    AND ACTION = CHARGED) as b
ON a.CUST_ID = b.CUST_ID
WHERE 
    a.TIME < b.TIME

让我以一种有意义的方式解释它。

A = REQUEST_CANCEL
B = CANCEL_ACCOUNT
C = CHARGED

如何查询A和C何时存在但B缺失。序列需要精确A> B> C.它实质上是在查询存在的两个值之间不存在的东西。在我当前的查询中,B可以在两个值之间返回,这不是我想要的。

sql prestodb
2个回答
0
投票

我想你正在寻找NOT EXISTS和一个相关的子查询。

SELECT *
       FROM (SELECT *
                    FROM customer_info
                    WHERE action = 'REQUEST_CANCEL') rc
            INNER JOIN (SELECT *
                               FROM customer_info
                               WHERE action = 'CHARGED') c
                       ON c.cust_id = rc.cust_id
                          AND c.date_time >= rc.date_time
       WHERE NOT EXISTS (SELECT *
                                FROM customer_info ca
                                WHERE ca.cust_id = rc.cust_id
                                      AND ca.action = 'CANCEL_ACCOUNT'
                                      AND ca.date_time >= rc.date_time
                                      AND ca.date_time <= c.date_time);

0
投票

使用group byhaving

select cust_id
from customer_info ci
where date_time = 20180726 and
      action in ('REQUEST_CANCEL', 'CHARGED', 'CANCEL_ACCOUNT')
group by cust_id
having sum(case when action = 'REQUEST_CANCEL' then 1 else 0 end) > 0 and
       sum(case when action = 'CHARGED' then 1 else 0 end) > 0 and
       sum(case when action = 'CANCEL_ACCOUNT' then 1 else 0 end) = 0 ;

每个sum()计算该操作的客户匹配记录的数量。 > 0说存在一个。 = 0说不存在。

数据库与此逻辑无关。 Here是一个使用MySQL的SQL小提琴。

© www.soinside.com 2019 - 2024. All rights reserved.