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上很糟糕.如果可能的话,有关如何最好地实现这种以性能为导向的想法?
谢谢
您可以使用窗口函数来获取行号(类似于聚合但实际上不是),然后过滤
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)
更多关于本文中的窗口函数