2015-04-03 38 views
-1

我需要爲每個用戶(user_id)計算3個最大值,每個方式PostgreSQL:顯示每個組的幾個最大行數?

我的表:

> db=# SELECT * FROM test; 

    id | user_id | value | way 
    ----+------------+----------+------ 
     1 |   1 | 10  | 1 
     2 |   2 | 30  | 1 
     3 |   3 | 20  | 1 
     4 |   1 | 50  | 2 
     5 |   2 | 40  | 2 
     6 |   3 | 60  | 2 
     7 |   2 | 70  | 3 
     8 |   4 | 5  | 1 
    (8 rows) 

表,我需要:

user_id | MAX1  | MAX2  | MAX3 
    ----+------------+----------+------ 
     1 |   0 | 1  | 1 
     2 |   2 | 0  | 1 
     3 |   1 | 1  | 0 
     4 |   1 | 0  | 0 

我。即user_id 2具有最大值方式1,方式3和第三個最大值方式3user_id 1方式2上有第二最大值,在方式1上有第二最大值。 等

請幫我創建正確的查詢。

謝謝!

回答

1

您需要在cte內使用row_number partitioned by way order by value;

with cte as(
    select 
      id, 
      user_id,val, 
      row_number() over(partition by way order by val desc) rank, 
      val, 
      way  
    from test) 
    select distinct cte2.user_id, 
      (select count(*) from cte where cte.rank=1 and cte.user_id=cte2.user_id) as MAX1, 
      (select count(*) from cte where cte.rank=2 and cte.user_id=cte2.user_id) as MAX2, 
      (select count(*) from cte where cte.rank=3 and cte.user_id=cte2.user_id) as MAX3 
    from cte cte2 where rank<=3 
    order by 1 

SQLFIDDLE DEMO

+0

我試試你的查詢!它的工作,但user_id 4,沒有顯示。 – Jurik 2015-04-03 13:49:35

+0

@Jurik,請再次查看示例輸入數據,user_id = 4的第4個值的方式= 1,並且它的方式爲1,因此根據您的輸入數據和描述,它既沒有max1,也沒有max2,也沒有max3 ,所需輸出中的最後一條記錄是錯誤的。 – jfun 2015-04-03 13:56:37

+0

你是對的,對不起! – Jurik 2015-04-03 15:19:35

0

我可以來理解這個問題的最接近的是,它僅僅是有條件聚集:

select user_id, 
     sum(case when way = 1 then 1 else 0 end) as way1, 
     sum(case when way = 2 then 1 else 0 end) as way2, 
     sum(case when way = 3 then 1 else 0 end) as way3 
from test 
group by user_id; 

我注意到,你的原始數據有8行的數字中結果集加起來爲8.我不知道「最大」是什麼。