[英]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 by
並having
:
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.