簡體   English   中英

SQL-如何查找兩行之間缺少值的條目

[英]SQL - How to find entries where a value is missing between two rows

我們正在使用Presto SQL。 我已經花了數小時試圖尋找這個問題的答案,但是找不到答案,而且很難找到。 解決此問題為解決許多問題打開了大門。

我需要編寫一個查詢,嘗試查找存在REQUEST_CANCEL&CHARGED但缺少CANCEL_ACCOUNT的所有條目。

CHARGED&CANCEL_ACCOUNT應該總是在REQUEST_CANCEL之后。

表名稱: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,這不是我想要的。

我認為您正在搜索NOT EXISTS和corellated子查詢。

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

使用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表示不存在。

數據庫對此邏輯無關緊要。 是使用MySQL的SQL Fiddle。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM