Postgres/Redshift按状态计算最后5行

Pep*_*zza 1 sql postgresql amazon-redshift

我有一张桌子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
Run Code Online (Sandbox Code Playgroud)

我需要的是按pid计数分组最后5行(按ID排序)中有多少具有状态3.

所以我想要得到的是:

pid, is_3
---------
x  | 1
y  | 0
z  | 2
Run Code Online (Sandbox Code Playgroud)

我试图通过如下查询实现此目的:

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

请注意,我尝试pid通过id排序获取给定的最后5行,因为id是这里的序列.

但我得到一个错误ERROR: column "A.id" must appear in the GROUP BY clause or be used in an aggregate function.显然我在SQL上很糟糕.如果可能的话,有关如何最好地实现这种以性能为导向的想法?

谢谢

Ale*_*Yes 5

您可以使用窗口函数来获取行号(类似于聚合但实际上不是),然后过滤

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
Run Code Online (Sandbox Code Playgroud)

更多关于本文中的窗口函数