【问题标题】:How to Perform Window Partitioning with Conditions (Oracle)如何使用条件执行窗口分区 (Oracle)
【发布时间】:2018-11-13 02:59:22
【问题描述】:

我需要知道如何根据条件缩小我的分区窗口。例如,如果我有以下情况:

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,我只需要考虑我的窗口计数,所以对于ID = 1,计数应该是2而不是3,因为第一行是TYPE = KID = 2,其中计数是 3)。

这可能吗?

【问题讨论】:

  • 你的预期输出是什么?

标签: sql oracle oracle12c database-partitioning


【解决方案1】:

也许你想要的是条件聚合:

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

【讨论】:

  • 就可以了。谢谢。
猜你喜欢
  • 2016-04-10
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多