我必須將 LATEST CLICK 作為 Event_Type 為 click 的 ID 的最新日期。并為 Event_Type = 'open' 做類似的事情。我有這樣的資料:
| ID | 事件型別 | SRC_創建 |
|---|---|---|
| 1 | 點擊 | 2021-04-10 01:50:08.490 |
| 1 | 點擊 | 2021-03-10 02:221:05.115 |
| 1 | 打開 | 2021-06-10 01:12:08.288 |
| 1 | 點擊 | 2021-08-10 01:50:08.490 |
需要的結果:
| ID | 事件型別 | SRC_創建 |
|---|---|---|
| 1 | 點擊 | 2021-08-10 01:50:08.490 |
| 1 | 打開 | 2021-06-10 01:12:08.288 |
我已經使用了下面提到的查詢,它作業正常,但我想用單個連接替換 2 個以某種方式使用的連接來獲取這兩個資料。誰能想到一個解決方法查詢?
CREATE OR REPLACE table CUSTOMER AS
select CONCAT(NVL(ADD1,''),NVL(ADD2,'')) AS ADDRESS,
CASE
WHEN NVL(GENDER,'')='F' THEN 'Female'
WHEN NVL(GENDER,'')='M' THEN 'Male'
WHEN NVL(GENDER,'')='U' Then 'Other'
ELSE ''
END AS GENDER,
***CLICK AS LAST_CLICK,
OPENS AS LAST_EMAIL_CLICK,***
B.PHONE AS PHONE,
A.SRC_CREATED AS SINCE,
from "HXP_SANDBOX"."BASE_RA_TEST"."IDENTITY" A
inner join "HXP_SANDBOX"."BASE_RA_TEST"."EMAIL_INTERACTIONS" B
on A.DIGITALID = B.DIGITALID
***inner JOIN (SELECT DIGITALID,MAX(SRC_CREATED) CLICK
from "HXP_SANDBOX"."BASE_RA_TEST"."EMAIL_INTERACTIONS" t
where EVENT_TYPE = 'click'
group by DIGITALID) C
on A.DIGITALID = C.DIGITALID
inner JOIN (SELECT DIGITALID,MAX(SRC_CREATED) OPENS
from "HXP_SANDBOX"."BASE_RA_TEST"."EMAIL_INTERACTIONS" t
where EVENT_TYPE = 'open'
group by DIGITALID) D
on A.DIGITALID = D.DIGITALID;***
uj5u.com熱心網友回復:
您應該能夠執行以下操作,您可以在其中使用 aCASE將MAX其限制為您想要的事件型別。
CREATE OR REPLACE TABLE CUSTOMER
AS
SELECT CONCAT(NVL(ADD1,''), NVL(ADD2,'')) AS [ADDRESS]
, CASE
WHEN NVL(GENDER,'')='F' THEN 'Female'
WHEN NVL(GENDER,'')='M' THEN 'Male'
WHEN NVL(GENDER,'')='U' Then 'Other'
ELSE ''
END AS GENDER
, C.CLICK AS LAST_CLICK
, C.OPENS AS LAST_EMAIL_CLICK
, B.PHONE AS PHONE
, A.SRC_CREATED AS SINCE
FROM "HXP_SANDBOX"."BASE_RA_TEST"."IDENTITY" A
INNER JOIN "HXP_SANDBOX"."BASE_RA_TEST"."EMAIL_INTERACTIONS" B ON A.DIGITALID = B.DIGITALID
INNER JOIN (
SELECT DIGITALID
, MAX(CASE WHEN EVENT_TYPE = 'click' THEN SRC_CREATED ELSE NULL END) CLICK
, MAX(CASE WHEN EVENT_TYPE = 'open' THEN SRC_CREATED ELSE NULL END) OPENS
FROM "HXP_SANDBOX"."BASE_RA_TEST"."EMAIL_INTERACTIONS" t
GROUP BY DIGITALID
) C ON A.DIGITALID = C.DIGITALID;
uj5u.com熱心網友回復:
用這個 CTE 提供資料
SELECT column1 as id, column2 as event_type, to_timestamp(column3) as src_created
FROM VALUES
(1,'click','2021-04-10 01:50:08'),
(1,'click','2021-03-10 02:21:05'),
(1,'open','2021-06-10 01:12:08'),
(1,'click','2021-08-10 01:50:08')
)
下面的 SQL 給出了你想要的答案:
SELECT
id
,event_type
,max(src_created)
FROM fake_data
GROUP BY 1,2
ORDER BY 1,2;
這使:
| ID | 事件型別 | 最大(SRC_創建) |
|---|---|---|
| 1 | 點擊 | 2021-08-10 01:50:08.000 |
| 1 | 打開 | 2021-06-10 01:12:08.000 |
但是您要求的不是您的 SQL 所做的,而 Dale 的回答顯示了如何做到這一點。
在我的示例資料中,這與以下內容相同:
SELECT
id
,max(iff(event_type='click', src_created, null)) as last_click
,max(iff(event_type='open', src_created, null)) as last_click
FROM fake_data
GROUP BY 1
您可以使用 CASE 或 IFF,我更喜歡 IFF,因為它更短且更明確。如果您要使用 CASE 路徑,則可以洗掉它,ELSE NULL因為這是默認行為。
因此,戴爾的例子可以是:
,MAX(CASE WHEN event_type = 'click' THEN src_createdEND) AS click
,MAX(CASE WHEN event_type = 'open' THEN src_createdEND) AS opens
``
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/427763.html
