如何根据条件执行 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 = KID = 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