2017-08-09 68 views
0

我有一個簡單的數據集,我想標記user_id誰在左連接有任何匹配的行作爲有'曾'採取行動,並通過擴展標記誰有'從未'採取行動。你如何將多個團體凝聚成一個團體?

我無法凝聚GROUP BY得到的值,以便爲每個user_id獲取單個值,前提是他們有'曾經'採取了行動。

見rextester的樣本數據和查詢:http://rextester.com/BOVT75663

訪問:

| loc_id | user_id | site_visit_date | site_visit_count | 
|--------|---------|-----------------|------------------| 
| 1234 | 003  | 06/05/2016  | 1    | 
| 1234 | 003  | 06/06/2016  | 1    | 
| 1234 | 003  | 06/09/2016  | 1    | 
| 1234 | 802  | 05/18/2016  | 1    | 
| 1234 | 818  | 02/19/2016  | 1    | 
| 1234 | 818  | 02/21/2016  | 1    | 
...and so on 

操作:

| loc_id | user_id | action_date | action_category | action_count | 
|--------|---------|-------------|-----------------|--------------| 
| 1234 | 003  | 06/05/2016 | action123  | 2   | 
| 1234 | 003  | 06/14/2016 | action123  | 5   | 
| 1234 | 003  | 07/01/2016 | action123  | 1   | 
| 1234 | 868  | 02/29/2016 | action123  | 13   | 
| 1234 | 868  | 03/17/2016 | action123  | 9   | 
| 1234 | 877  | 02/08/2016 | action123  | 5   | 
| 1234 | 877  | 03/25/2016 | action123  | 4   | 

所需的輸出:

| user_id | ever_never | sum | 
|---------|------------|------| 
| 3  | ever  | 7 | 
| 802  | never  | NULL | 
| 818  | never  | NULL | 
| 868  | ever  | 22 | 
| 871  | never  | NULL | 
| 876  | never  | NULL | 
| 877  | ever  | 9 | 

電流輸出/查詢:

| user_id | ever_never | sum | 
|---------|------------|------| 
| 3  | ever  | 7 | 
| 3  | never  | NULL | 
| 802  | never  | NULL | 
| 818  | never  | NULL | 
| 868  | ever  | 22 | 
| 868  | never  | NULL | 
| 871  | never  | NULL | 
| 876  | never  | NULL | 
| 877  | ever  | 9 | 
| 877  | never  | NULL | 

with tbl as (
select 
    v.loc_id 
    ,v.user_id 
    ,TO_CHAR(v.site_visit_date,'YYYY-MM-DD') 
    ,v.site_visit_count 
    ,TO_CHAR(a.action_date,'YYYY-MM-DD') 
    ,a.action_category 
    ,a.action_count 
    ,case when a.action_count >=1 then 'ever' else 'never' end ever_never 
from 
    visits v 
    left join actions a on v.user_id = a.user_id and v.site_visit_date = a.action_date 
order by 1,2,5 
) 
select 
    user_id 
    ,ever_never 
    ,sum(action_count) 
from 
    tbl 
group by 
    user_id 
    ,ever_never 
order by 1,2 
+0

兩個答案通過使用聚集函數的選擇所討論的基團的期望的最小/最大足夠了。我現在看到,根據所期望的'ever/never'狀態來標記成員的更有效方法是1/0,以確保最小/最大值產生期望的數字結果而不是字符串。 – psrpsrpsr

回答

1

可以使用MIN功能選擇ever,當時也有a never

with tbl as (
select 
    v.loc_id 
    ,v.user_id 
    ,TO_CHAR(v.site_visit_date,'YYYY-MM-DD') 
    ,v.site_visit_count 
    ,TO_CHAR(a.action_date,'YYYY-MM-DD') 
    ,a.action_category 
    ,a.action_count 
    ,case when a.action_count >=1 then 'ever' else 'never' end ever_never 
from 
visits v 
left join actions a on v.user_id = a.user_id and v.site_visit_date = a.action_date 
order by 1,2,5 
) 
select 
    user_id 
    ,MIN(ever_never) 
    ,sum(action_count) 
from 
    tbl 
group by 
    user_id 
order by 1,2 

檢查結果:http://rextester.com/live/LQDR42614

1

從最後group by刪除ever_never

select user_id, min(ever_never) as ever_never, sum(action_count) 
from tbl 
group by user_id 
order by 1 
+0

這給了我一個'永不'user_ids應該是一個'永遠'根據他們在左連接的匹配。如果我能澄清這個帖子,請讓我知道。 – psrpsrpsr