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

时间:2018-05-07 16:10:56

标签: sql postgresql amazon-redshift

我有一张桌子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上很糟糕。如果可能的话,有关如何最好地实现这种以性能为导向的想法吗?

由于

1 个答案:

答案 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

中窗口函数的更多信息