2009-07-15 19 views
3

我有一個查詢,如:SQL如何限制BOTTOM x行(PostgreSQL的)

SELECT 
EXTRACT(WEEK FROM j.updated_at) as "week", count(j.id) 
FROM jobs  
WHERE 
EXTRACT(YEAR FROM j.updated_at)=2009 
GROUP BY EXTRACT(WEEK FROM j.updated_at) 
ORDER BY week 

,工作正常,但我只想要展示的最後說,12周,限12件作品,但只給了我前十二,我需要訂單順序(即不反轉)爲圖表的目的...

是否有在Postgresql等效語句,如顯示BOTTOM x項目?

回答

6
SELECT * 
FROM (
     SELECT EXTRACT(WEEK FROM j.updated_at) as "week", count(j.id) 
     FROM jobs  
     WHERE EXTRACT(YEAR FROM j.updated_at)=2009 
     GROUP BY 
       EXTRACT(WEEK FROM j.updated_at) 
     ORDER BY week DESC 
     LIMIT 12 
     ) q 
ORDER BY 
     week ASC 

需要注意的是,如果你有updated_at索引,你可以重寫此查詢一點,所以它的效率更高:

SELECT week, 
     (
     SELECT COUNT(j.id) 
     FROM jobs 
     WHERE updated_at >= start_week 
       AND updated_at < end_week 
     ) 
FROM (
     SELECT week, 
       '04.01.2009'::DATE - EXTRACT(DOW FROM '04.01.2009'::DATE)::INTEGER + week * 7 
       '04.01.2009'::DATE - EXTRACT(DOW FROM '04.01.2009'::DATE)::INTEGER + week * 7 + 7 
     FROM generate_series(42, 53) week 
     ) q 
+0

限制應該在內部查詢中。 – 2009-07-16 04:02:40

+0

@depesz:對,修復,謝謝。 – Quassnoi 2009-07-16 06:36:28

3

如果的增加,你可以訂單價值BY WEEK DESC然後取TOP 12,對吧?

更新: 然後,您需要重新排序12個結果行,使其按時間順序排列,使用ORDER BY Week ASC。 (我輕輕帶過,讓他們按升序事後請求;謝謝你,etlerant!)

0
SELECT * FROM 
(
    SELECT 
     EXTRACT(WEEK FROM j.updated_at) as "week", 
     count(j.id) 
    FROM 
     jobs  
    WHERE 
     EXTRACT(YEAR FROM j.updated_at) = 2009 
    GROUP BY EXTRACT(WEEK FROM j.updated_at) 
    ORDER BY week desc limit 12 
) as x 
ORDER BY week asc; 

「爲x」是很重要的,因爲在子查詢需要的別名。