2015-11-23 5 views
1

У меня есть таблица со столбцами: FILING_ID, DATE и BLAHДля каждого уникального значения некоторого столбца groupid, как мне получить строки с последними 3 датами?

Я пытаюсь написать запрос, который для каждого FILING_ID, возвращает строки с последние три даты. Если таблица:

FILING_ID DATE  
    aksjdfj 2/1/2006 
      b 2/1/2006 
      b 3/1/2006 
      b 4/1/2006 
      b 5/1/2006 

Я хотел бы:

FILING_ID DATE  
    aksjdfj 2/1/2006 
      b 3/1/2006 
      b 4/1/2006 
      b 5/1/2006 

Я думал, может быть запущен какой-то запрос, чтобы выяснить, 3-й самый высокий даты для каждого FILING_ID затем делает объединение и сравнивая дату отсечки с DATE?

Я использую PostgreSQL. Есть ли способ использовать лимит?

ответ

1
SELECT filing_id, date -- more columns? 
FROM (
    SELECT *, row_number() OVER (PARTITION BY filing_id ORDER BY date DESC NULLS LAST) AS rn 
    FROM tbl 
    ) sub 
WHERE rn < 4 
ORDER BY filing_id, date; -- optionally order rows 

NULLS LAST имеет значение только если date действительно может быть NULL.
Если date не уникален, вам может потребоваться разорвать галстуки, чтобы получить стабильные результаты.

Есть ли способ использовать ограничение?

Возможно. Если у вас есть дополнительная таблица держит различныfiling_id (и, возможно, еще несколько, которые удаляются с помощью объединения), вы можете использовать CROSS JOIN LATERAL (, LATERAL короткий синтаксис):

SELECT f.filing_id, t.* 
FROM filing f -- table with distinct filing_id 
    , LATERAL (
    SELECT date -- more columns? 
    FROM tbl 
    WHERE filing_id = f.filing_id 
    ORDER BY date DESC NULLS LAST 
    LIMIT 3 -- now you can use LIMIT 
    ) t 
ORDER BY f.filing_id, t.date; 

Если у вас нет таблицы filing, вы можете создать ее. Или вывести его на лету:

+0

Спасибо за тонну! Крошечная опечатка, что rn не определена, но я думаю, что решил это самостоятельно. –

+1

@MatthewGunn: Да, добавлен недостающий псевдоним, спасибо. –

+0

Еще раз спасибо! row_number(), раздел и т. д. ... медленно, но уверенно расширяю свой SQL-инструментарий! –

Смежные вопросы