我有一张桌子A:
ngModule.service('$ui', function () {
//#region Methods
/*
* Trigger windows resize function.
* */
this.reloadWindowSize = () => {
$(window).resize();
};
//#endregion
});
我需要的是按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
分组计算最后5行(按ID排序)中有多少具有状态3。
所以我想要的是:
pid
我试图用以下查询来实现这个目标:
pid, is_3
---------
x | 1
y | 0
z | 2
请注意,我尝试通过id排序获取给定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行,因为id是此处的序列。
但我收到错误pid
。显然我在SQL上很糟糕。如果可能的话,有关如何最好地实现这种以性能为导向的想法吗?
由于
答案 0 :(得分: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
有关此article
中窗口函数的更多信息