[英]postgreSQL ranking query with the given user_id
我正在嘗試通過他們的二維參數來對用戶進行排名 : donation sum
和total donor count
。
我的排名公式是: rank of [rank of donation_sum + rank of donor_count / 2]
樣表:
donation_id | user_id | donor_id | donation_sum
-----------------------------------------------
1 | 1 | 1 | 10
2 | 1 | 2 | 5
3 | 2 | 3 | 10
4 | 3 | 1 | 50
...
如您所見,一些捐贈者向不同的用戶捐贈,所以我使用sum(donation_sum)
和count(distinct(donation_id))
來獲得准確的排名
我可以使用2 sql按捐贈金額和捐贈者總數單獨獲得排名列表,但我需要通過PostgreSQL 9.4版中給定的user_id
獲得具有該公式的用戶排名。
您有解決方案嗎? 所以我將在Yii2 PHP框架中使用該sql查詢
謝謝
編輯:我們將donation_date添加到tbl_donation並修改了實際查詢,如下所示:
with list as (
select
s.runner_id, sum, count, rank_sum, rank_count,
(rank_sum+ rank_count)::float/ 2 as rank_avg,
row_number() over (order by rank_sum) as rank
from (
select *, rank() over (order by sum desc) rank_sum
from (
select runner_id, sum(donation_sum)
from tbl_donation
where donation_date >= '2015-01-01'
group by 1
) s
) s
join (
select *, rank() over (order by count desc) rank_count
from (
select runner_id, count(distinct(donator_id))
from tbl_donation
where donation_date >= '2015-01-01'
group by 1
) c
) c
using (runner_id)
)
select rank
from list
where runner_id = 251;
在單獨的子查詢中進行兩個排名:
select
s.user_id, sum, count, rank_sum, rank_count,
(rank_sum+ rank_count)::float/ 2 as rank_avg,
row_number() over (order by rank_sum) as rank
from (
select *, rank() over (order by sum desc) rank_sum
from (
select user_id, sum(donation_sum)
from donations
group by 1
) s
) s
join (
select *, rank() over (order by count desc) rank_count
from (
select user_id, count(distinct(donation_id))
from donations
group by 1
) c
) c
using (user_id);
user_id | sum | count | rank_sum | rank_count | rank_avg | rank
---------+-----+-------+----------+------------+----------+------
3 | 100 | 1 | 1 | 2 | 1.5 | 1
1 | 30 | 2 | 2 | 1 | 1.5 | 2
2 | 20 | 1 | 3 | 2 | 2.5 | 3
(3 rows)
如果要為單個user_id
選擇rank
,請with query
使用,例如:
with list as (
-- place here the above query
)
select rank
from list
where user_id = 2;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.