如何根据条件执行 Window 分区 (Oracle)
How to Perform Window Partitioning with Conditions (Oracle)
我需要知道如何根据条件缩小我的分区 window。例如,如果我有以下内容:
SELECT
T1.*,
COUNT(T1.ID) OVER (PARTITION BY ID)
FROM TBL T1
WHERE /* some other conditions */;
我需要 ID 分区只是具有 T1.TYPE = 'J'
的所有相同 ID 的子集。
+---------+--------+---------------+--------+
| ID | TYPE | OTH1 | OTH2 |
+---------+--------+---------------+--------+
| 1 | K | 500 | RER |
| 1 | J | 503 | LEL |
| 1 | J | 534 | KEL |
| 2 | J | 536 | NULL |
| 2 | J | 667 | ERT |
| 2 | J | 98 | NULL |
+---------+--------+---------------+--------+
在这个数据集中,如果 TYPE = J
,我只需要考虑我的 window 计数,所以对于 ID = 1
,计数应该是 2 而不是 3,因为第一行是TYPE = K
(ID = 2
其中计数为 3)。
这可能吗?
也许条件聚合就是您想要的:
SELECT
t.*,
COUNT(CASE WHEN TYPE = 'J' THEN 1 END) OVER (PARTITION BY ID) cnt
FROM TBL t
如果您只想显示那些实际具有 J
类型的记录的计数,那么我们可以尝试:
SELECT
t.*,
CASE WHEN TYPE = 'J'
THEN COUNT(CASE WHEN TYPE = 'J' THEN 1 END) OVER (PARTITION BY ID)
ELSE 0 END cnt
FROM TBL t
我需要知道如何根据条件缩小我的分区 window。例如,如果我有以下内容:
SELECT
T1.*,
COUNT(T1.ID) OVER (PARTITION BY ID)
FROM TBL T1
WHERE /* some other conditions */;
我需要 ID 分区只是具有 T1.TYPE = 'J'
的所有相同 ID 的子集。
+---------+--------+---------------+--------+
| ID | TYPE | OTH1 | OTH2 |
+---------+--------+---------------+--------+
| 1 | K | 500 | RER |
| 1 | J | 503 | LEL |
| 1 | J | 534 | KEL |
| 2 | J | 536 | NULL |
| 2 | J | 667 | ERT |
| 2 | J | 98 | NULL |
+---------+--------+---------------+--------+
在这个数据集中,如果 TYPE = J
,我只需要考虑我的 window 计数,所以对于 ID = 1
,计数应该是 2 而不是 3,因为第一行是TYPE = K
(ID = 2
其中计数为 3)。
这可能吗?
也许条件聚合就是您想要的:
SELECT
t.*,
COUNT(CASE WHEN TYPE = 'J' THEN 1 END) OVER (PARTITION BY ID) cnt
FROM TBL t
如果您只想显示那些实际具有 J
类型的记录的计数,那么我们可以尝试:
SELECT
t.*,
CASE WHEN TYPE = 'J'
THEN COUNT(CASE WHEN TYPE = 'J' THEN 1 END) OVER (PARTITION BY ID)
ELSE 0 END cnt
FROM TBL t