2017-03-30 100 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也是如此,他提前几分钟就得到了。感谢您的答复 :) –

相关问题