Postgres / Redshift Считать последние 5 строк по статусу - PullRequest
0 голосов
/ 07 мая 2018

У меня есть таблица A:

id, pid, status
---------------
1 | x |   3
2 | x |   2
3 | y |   0
4 | y |   1
5 | z |   3
6 | y |   1
7 | x |   2
8 | z |   3

Мне нужно сгруппировать по pid подсчитать, сколько из последних 5 строк (упорядоченных по id) имеют статус 3.

Итак, что я пытаюсь получить:

pid, is_3
---------
x  | 1
y  | 0
z  | 2

Я пытаюсь достичь этого с помощью запроса:

SELECT pid, 
COUNT(CASE WHEN status=3 THEN 1 END) AS is_3 
FROM A 
GROUP BY pid 
ORDER BY id desc
LIMIT 5;

Обратите внимание, что я пытаюсь получить последние 5 строк для данного pid, упорядочив по id, потому что здесь id - это последовательность.

Но я получаю сообщение об ошибке ERROR: column "A.id" must appear in the GROUP BY clause or be used in an aggregate function. Очевидно, я ужасен в SQL. Любые мысли о том, как наилучшим образом достичь этой ориентированной на производительность, если это возможно?

Спасибо

1 Ответ

0 голосов
/ 07 мая 2018

вы можете использовать оконную функцию, чтобы получить номер строки (аналогично агрегатному, но не фактическому), затем отфильтровать

select pid, sum(case when status=3 then 1 else 0 end) as status_3_cnt
from (
    select *, row_number() over (partition by pid order by id desc)  
    from your_table
)
where row_number<=5
group by 1

Подробнее об оконных функциях в этой статье

...