簡體   English   中英

給定user_id的postgreSQL排名查詢

[英]postgreSQL ranking query with the given user_id

我正在嘗試通過他們的二維參數來對用戶進行排名donation sumtotal 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並修改了實際查詢,如下所示:

這是donation_date在哪里的真實用法?

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM