2017-03-30 155 views
1

圖片此表交互的業務與人們:我可以在CASE語句中使用變量條件嗎?

+-----------+---------------------+-----------------+ 
| user_name | action_timestamp | action   | 
+-----------+---------------------+-----------------+ 
| john  | 2017-01-01 10:00:00 | phone_call  | 
+-----------+---------------------+-----------------+ 
| john  | 2017-01-02 12:00:00 | became_customer | 
+-----------+---------------------+-----------------+ 
| john  | 2017-01-03 14:00:00 | phone_call  | 
+-----------+---------------------+-----------------+ 
| jane  | 2016-08-06 10:00:00 | phone_call  | 
+-----------+---------------------+-----------------+ 
| jane  | 2016-08-06 11:00:00 | phone_call  | 
+-----------+---------------------+-----------------+ 
| jane  | 2016-08-06 12:00:00 | became_customer | 
+-----------+---------------------+-----------------+ 
| tony  | 2016-12-01 15:00:00 | phone_call  | 
+-----------+---------------------+-----------------+ 

我想要得到的東西是這樣的:

+-----------+---------------+-------------+---------------------+------------------------------+-----------------------------+ 
| user_name | total_actions | is_customer | became_customer  | interactions_before_customer | interactions_after_customer | 
+-----------+---------------+-------------+---------------------+------------------------------+-----------------------------+ 
| john  | 3    | TRUE  | 2017-01-02 12:00:00 | 1       | 1       | 
+-----------+---------------+-------------+---------------------+------------------------------+-----------------------------+ 
| jane  | 3    | TRUE  | 2016-08-06 12:00:00 | 2       | 0       | 
+-----------+---------------+-------------+---------------------+------------------------------+-----------------------------+ 
| tony  | 1    | FALSE  | NULL    | 1       | 0       | 
+-----------+---------------+-------------+---------------------+------------------------------+-----------------------------+ 

第4列是微不足道的一些分組和案例,但我不知道如何做第5和第6列(客戶之前的交互以及客戶之後的交互),因爲案例是根據前一列的結果進行判斷的,需要在行之間進行變化。

這是比它顯得更簡單嗎?如果有人關心,我不在呼叫中心工作,它只是一個更簡單的模擬我想要做的;)

回答

2

這會給你一個想法。我已經在ORACLE測試這一點,它工作正常,

WITH CUS_DET AS (
    SELECT * 
    FROM INTERACTIONS 
    WHERE ACTION = 'became_customer' 
) 
SELECT INTERACTIONS.USER_NAME 
    , SUM(CASE 
    WHEN (CUS_DET.ACTION_TIMESTAMP IS NULL 
      OR INTERACTIONS.ACTION_TIMESTAMP < CUS_DET.ACTION_TIMESTAMP) 
    THEN 1 
    ELSE 0 
    END) BEF 
    , SUM(CASE 
    WHEN INTERACTIONS.ACTION_TIMESTAMP > CUS_DET.ACTION_TIMESTAMP 
    THEN 1 
    ELSE 0 
    END) AFT 
FROM INTERACTIONS 
    LEFT OUTER JOIN CUS_DET 
    ON INTERACTIONS.USER_NAME = CUS_DET.USER_NAME 
GROUP BY INTERACTIONS.USER_NAME; 
+0

真棒。謝謝! –

2

使用條件聚合如果一個用戶只能成爲客戶的一次:

select 
    t.user_name 
    , case when c.action_timestamp is not null then 'Yes' else 'No' end as Is_Customer 
    , c.action_timestamp as became_customer 
    , count(case when t.action_timestamp < coalesce(c.action_timestamp,'2525-01-01') then 1 end) as interactions_before_customer 
    , count(case when t.action_timestamp > c.action_timestamp then 1 end) as interactions_after_customer 
from t 
    left join t as c 
    on t.user_name = c.user_name 
     and c.action = 'became_customer' 
group by t.user_name, c.action_timestamp 

rextester演示:http://rextester.com/LOUGN53032

+-----------+-------------+---------------------+------------------------------+-----------------------------+ 
| user_name | Is_Customer | became_customer | interactions_before_customer | interactions_after_customer | 
+-----------+-------------+---------------------+------------------------------+-----------------------------+ 
| tony  | No   | NULL    |       1 |       0 | 
| jane  | Yes   | 2016-08-06 12:00:00 |       2 |       0 | 
| john  | Yes   | 2017-01-02 12:00:00 |       1 |       1 | 
+-----------+-------------+---------------------+------------------------------+-----------------------------+ 
+0

阿格抱歉,在這些答案之間做出選擇非常困難!我想選擇這一個,只是因爲你是一位SQL名人,並且我學會了合併,但Pons也是如此,他提前幾分鐘就得到了。感謝您的答覆 :) –

相關問題