2017-10-12 18 views
1

我有一个名为请示表,其中包含以下几列:如何使用日期来分配总和的结果?

id | campaign | module | team | referred | referred_by | createdAt

为了获得军衔,我试图总结的referred_by独特的事件,然后对他们进行排名。这看起来似乎很有用,但是,当我发现排名会重复时,我会发现这一点。我需要的是也要考虑转介发生的日期(最早的日期应该排在第一位,打破平局)。

这是我原来的查询的例子:

SELECT referral.referred_by AS id, 
      SUM(1) AS referral_count, 
      RANK() OVER (ORDER BY referral.count DESC) AS current_position 

    FROM referral 

    WHERE referral.campaign = 106 AND 
     referral.team = 36 AND 
     DATE_PART('month', referral."createdAt") = DATE_PART('month', NOW()) AND 
     DATE_PART('year', referral."createdAt") = DATE_PART('year', NOW()) 

    GROUP BY referral.referred_by 
    ORDER BY referral_count DESC LIMIT 20 

SELECT date_trunc(r."createdAt"), r.referred_by, count(*) 

其中产量:

id | referral_count | current_position 

894 | 3    | 1 

895 | 2    | 2 

896 | 2    | 2 

897 | 1    | 4 

它应该理想地:

id | referral_count | current_position 

894 | 3    | 1 

895 | 2    | 2 

896 | 2    | 3 

897 | 1    | 4 

谢谢!

回答

0

使用CTE你可以有一个明确的intermedaite一步

with score as (
    SELECT 
     referral.referred_by AS id, 
     SUM(1) AS referral_count, 
     min(referral.createdAt) as min createdAt  
    FROM 
     referral 
    WHERE 
     referral.campaign = 106 AND 
     referral.team = 36 AND 
     DATE_PART('month', referral."createdAt") = DATE_PART('month', NOW()) AND 
     DATE_PART('year', referral."createdAt") = DATE_PART('year', NOW()) 
    GROUP BY 
     referral.referred_by 
) 
SELECT 
    id, 
    RANK() OVER (
     ORDER BY 
      referral_count DESC, 
      createdAt  DESC 
    ) AS current_position 
FROM 
    score 
+0

将这项工作正常 - 通过引用排序“createdAt” ? –

+0

https://stackoverflow.com/questions/7747327/sql-rank-versus-row-number – Indent

+0

indent - 问题是 - 它会排列createdAt?我不认为你的代码会。它会给出唯一的排名数字,但不是指定的。请看我的答案,看看我的意思。 –

1

你应该能够在created_at添加到您的订购

SELECT referral.referred_by AS id, 
      SUM(1) AS referral_count, 
      RANK() OVER (ORDER BY referral.count DESC,referral."createdAt") AS current_position 

    FROM referral 

    WHERE referral.campaign = 106 AND 
     referral.team = 36 AND 
     DATE_PART('month', referral."createdAt") = DATE_PART('month', NOW()) AND 
     DATE_PART('year', referral."createdAt") = DATE_PART('year', NOW()) 

    GROUP BY referral.referred_by 
    ORDER BY referral_count DESC LIMIT 20 

SELECT date_trunc(r."createdAt"), r.referred_by, count(*) 
相关问题