我有一個包含三種不同狀態的表'
單擊 > 索賠 > 購買(這是正確的順序)
(例如見下表)
對于每個 number_id,我需要將這些狀態日期時間中的每一個放在單獨的列中。
DROP TABLE TBL_A;
CREATE TABLE TBL_A
(
number_id varchar(50),
deadline_date datetime,
status varchar,
updated_at_datetime datetime
);
INSERT INTO TBL_A
VALUES (121144, '2021-12-30', 'clicked','2021-10-08'),
(121144, '2021-12-30', 'claimed','2021-10-09'),
(121144, '2021-12-30', 'bought','2021-10-10'),
(121111, '2021-11-30', 'clicked','2021-09-08'),
(121115, '2021-11-30', 'clicked','2021-07-08'),
(121122, '2021-12-15', 'clicked','2021-08-09'),
(121122, '2021-12-15', 'claimed','2021-08-10'),
(121166, '2021-12-20', 'clicked','2021-07-09'),
(121166, '2021-12-20', 'claimed','2021-08-09'),
(120022, '2021-12-15', 'bought','2021-06-10'),
(120023, '2021-12-20', 'bought','2021-06-09'),
(120024, '2021-12-20', 'claimed','2021-06-09');
select
NUMBER_ID,
deadline_date,
(array_agg(STATUS) within group(order by updated_at_datetime desc)[0])::varchar as last_status,
coalesce(max(case when STATUS = 'clicked' THEN updated_at_datetime END),'2999-12-31'::datetime) as clicked_date,
coalesce(max(case when STATUS = 'claimed' THEN updated_at_datetime END),'2999-12-31'::datetime) as claimed_date,
coalesce(max(case when STATUS = 'bought' THEN updated_at_datetime END),'2999-12-31'::datetime) as bought_date
from TBL_A a
group by 1,2
order by number_id
在最后一個查詢中,我需要查詢具有基于 updated_at_datetime 的 LAST 狀態,以及每個狀態的 update_at_datetime 在它們自己的 COLUMN 中。
當前,查詢表示如果該 number_ID 的狀態未找到,則將此值默認為 = '2999-12-31'
但是,現在我需要更新查詢以說明如果未找到 clicked 狀態,則根據以下狀態更新 clicked_datetime。
例如,如果未找到狀態 CLICKED 的 update_at_datetime(而不是將 clicked_datetime 更新為“2999-12-31”),則更新此日期以匹配 CLAIMED STATUS 的 update_at_datetime。如果也未找到 CLAIMED 狀態,則更新 clicked_datetime 以匹配購買的 STATUS 的 update_at_datetime。
CLICKED_DATETIME 應該總是有一個 VALID 日期,因為我們可以將它與狀態 = 'claimed' 的日期時間匹配,如果狀態 'claimed' 也沒有找到,更新狀態 = 'bought' 的 update_at_datetime 的 clicked_datetime
如果未找到 CLAIMED OR BOUGHT 狀態的 update_at_datetime,那么我們可以將此值默認為“2999-12-31”。
有人可以幫我修改最后一個查詢以考慮到這一點嗎?
uj5u.com熱心網友回復:
似乎很容易?
只需在聚結中添加更多內容即可。
select NUMBER_ID, deadline_date
, (array_agg(STATUS) within group(order by updated_at_datetime desc)[0])::varchar as last_status
, coalesce(
max(case when STATUS = 'clicked' THEN updated_at_datetime END)
, max(case when STATUS = 'claimed' THEN updated_at_datetime END)
, max(case when STATUS = 'reverted' THEN updated_at_datetime END)
, '2999-12-31'::datetime
) as clicked_date
, coalesce(max(case when STATUS = 'claimed' THEN updated_at_datetime END),'2999-12-31'::datetime) as claimed_date
, coalesce(max(case when STATUS = 'bought' THEN updated_at_datetime END),'2999-12-31'::datetime) as bought_date
from TBL_A a
group by number_id, deadline_date
order by number_id
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/363532.html
上一篇:如何使用子查詢查詢兩個表
