2015-05-27 38 views
0

我有一個事件表格,具有以下列user_id,points,created。我需要的是獲得給定月份的所有積分,給定的user_id總積分和總排名。我需要做的是在這導致了以下嘗試一個查詢:PostgreSQL查詢性能和變化

select 
    e.user_id, 
    sum(e.points) as total_points, 
    (select sum(points) from event where user_id = 1 and extract(month from created) = 1) as month_points, 
    (select rank from (select user_id as id, rank() over (order by sum(points) desc) from event group by user_id) as rank where id = 1) 
from 
    event pte 
where 
    e.user_id = 1 
group by 
    e.user_id 
; 

我想什麼要問的是:

  1. 此查詢可能會很慢?
  2. 它可以做得更好/以另一種方式?
  3. rank功能足夠可靠還是被誤用?
+0

1)這將是非常快的,因爲它包含一個錯誤(在第二個子查詢)。 2)是:更正錯誤3)取決於查詢的意圖 – wildplasser

+0

@wildplasser,我已經更新了這個問題。 – Opal

回答

1

假設PostgreSQL的版本大於或等於9.4,你可以使用集合filter條款,以避免子查詢的month_pointsrank

select * from 
    (select 
     e.user_id, 
     sum(e.points) as total_points, 
     sum(points) filter (where extract(month from created) = 1) as month_points, 
     rank() over (order by sum(points) desc) 
    from 
     event e 
    group by 
     e.user_id 
    ) as inner_query 
where user_id = 1; 
+0

它使這個查詢執行得更好嗎?如果我不能使用9.4,該怎麼辦? – Opal

+0

'過濾器'沒有在早期的pg版本中實現。性能?這取決於:如果table'event'很小,或者'user_id'上沒有索引,我的查詢應該會更好(但最好自己檢查一下)。 –

+0

謝謝。有和索引,它是一個外鍵。 – Opal