我有一个名为statustimeline的表,其结构为
id | applicationid | status | createdon
---+---------------+--------+----------
11 |1 |4 |
---+---------------+--------+----------
10 |1 |3 |
---+---------------+--------+----------
9 |1 |2 |
---+---------------+--------+----------
8 |1 |1 |
---+---------------+--------+----------
7 |2 |3 |
---+---------------+--------+----------
6 |2 |2 |
---+---------------+--------+----------
5 |2 |1 |
---+---------------+--------+----------
4 |3 |5 |
---+---------------+--------+----------
3 |3 |3 |
---+---------------+--------+----------
2 |3 |2 |
---+---------------+--------+----------
1 |3 |1 |
---+---------------+--------+----------
如果我按应用程序ID对其进行分区,将分为三组。
select applicationid,ngstatus, row_number() over (partition by applicationid order by id desc) rownumbr
from applicationstatustimeline ;
我只选择那些组的状态从未为status = 4的applicationid(在这种情况下,applicationid = 2,applicationid = 3)
有任何功能吗?
如果您想在这里使用解析函数,我们可以使用COUNT
:
WITH cte AS (
SELECT t.*,
COUNT(CASE WHEN status = 4 THEN 1 END) OVER (PARTITION BY applicationid) AS four_cnt
FROM applicationstatustimeline t
)
SELECT id, applicationid, status, createdon
FROM cte
WHERE four_cnt = 0;
在上面的CTE中,我们生成了一个计算列four_cnt
,其值对于每组applicationid
记录都是相同的。假设status=4
从未出现,那么该值将为零,否则它将大于零。
为什么不是简单的minus
集合运算符?