SQL Как ограничить ДНО x строк (PostgreSQL) - PullRequest
3 голосов
/ 15 июля 2009

У меня есть запрос вроде:

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 недель, LIMIT 12 работает, но дает мне только первые двенадцать, и мне нужно, чтобы порядок был в последовательном недельном порядке (т. Е. Не в обратном порядке) для построения графиков ...

Есть ли в Postgresql эквивалентный оператор, например Show BOTTOM x items?

Ответы [ 3 ]

7 голосов
/ 15 июля 2009
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
3 голосов
/ 15 июля 2009

Если значение для недели увеличивается, вы можете ЗАКАЗАТЬ ПО НЕДЕЛЕ DESC , а затем взять TOP 12 , верно?

UPDATE: Затем вам нужно будет переупорядочить 12 результирующих строк, чтобы получить их в хронологическом порядке, используя ORDER BY Week ASC . (Затем я замолчал над просьбой привести их в порядке возрастания; спасибо, старик!)

0 голосов
/ 16 июля 2009
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;

"as x" важно, поскольку подзапросы в from требуют псевдонимов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...