2014-01-23 29 views
0

我有一個表,它存儲不同類別的userids和他們的點。用戶數量將不斷變化。點也將不斷變化(如在計算器中的點)。因此,登錄用戶將看到一個儀表盤,其中說明了3個類別中的每一個 - 您有850點,在您之前有950個用戶。這是我現在的查詢 -PostgreSQL排名和相關

WITH USERS AS (
    SELECT COUNT(*) TOT 
    FROM user_pointS 
) 
SELECT ' You have ' || points_cat1 ||' points and there are '|| tot-rnk || ' ahead of you ' 
FROM (
    SELECT ID, 
      points_cat1, 
      rank() OVER (ORDER BY points_cat1 DESC) AS RNK 
    FROM user_pointS 
) AS RANKED, 
    USERS 
WHERE ID = 10 

有沒有更好的方法(性能方面)?我將不得不重複這3列?

回答

0

好了,你可以做到這一點,而不CTE:

SELECT ' You have ' || points_cat1 ||' points and there are '|| tot-rnk || ' ahead of you ' 
FROM (SELECT ID, points_cat1, 
       rank() OVER (ORDER BY points_cat1 DESC) AS RNK , 
       count(*) over() as TOT 
     FROM user_pointS 
    ) RANKED 
WHERE ID = 10; 

您可以一次做到這一點對所有三個名作:

SELECT ' You have ' || points_cat1 ||' points and there are '|| tot-rnk1 || ' ahead of you ', 
     ' You have ' || points_cat2 ||' points and there are '|| tot-rnk2 || ' ahead of you ', 
     ' You have ' || points_cat3 ||' points and there are '|| tot-rnk3 || ' ahead of you ' 

FROM (SELECT ID, points_cat1, points_cat2, points_cat3, 
       rank() OVER (ORDER BY points_cat1 DESC) AS RNK , 
       rank() OVER (ORDER BY points_cat2 DESC) AS RNK1 , 
       rank() OVER (ORDER BY points_cat3 DESC) AS RNK2 , 
       count(*) over() as TOT 
     FROM user_pointS 
    ) RANKED 
WHERE ID = 10; 

你或許可以取代tot-rnk具有反向排序:

rank() OVER (ORDER BY points_cat1 ASC) AS RNK 

但你想測試一下,以確保它給你的結果你期望。

+0

外部select中的points_cat1,2,3應該是rnk,rnk1,rnk2。除此之外,這工作。謝謝。 – Jayadevan

+0

@Jayadevan。 。 。文中說,你有很多關於排名的點。第二部分使用'rnk'變量。但是,這是你的問題,所以你可以放入你想要的東西。 –

+0

當我使用查詢發佈時,我得到了錯誤:列「points_cat2」不存在 ,因爲我們沒有內部SELECT中的那列。所以我應該將這些列也添加到內部選擇。 – Jayadevan