oracle 12c-使用width\u bucket和over partition by子句

yjghlzjz  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(610)

我有以下数据集(简化),它包含一个“工作类型”和一个与该工作类型相关联的“任务时间”。

  1. +-----------+----------+--------+
  2. | WORK_TYPE | TASKTIME | OUTPUT |
  3. +-----------+----------+--------+
  4. | TYPE1 | 10 | 1 |
  5. | TYPE1 | 20 | 1 |
  6. | TYPE1 | 30 | 2 |
  7. | TYPE1 | 30 | 2 |
  8. | TYPE2 | 10 | 1 |
  9. | TYPE2 | 10 | 1 |
  10. | TYPE2 | 20 | 2 |
  11. | TYPE2 | 20 | 2 |
  12. +-----------+----------+--------+

我希望在这个数据集上使用width\u bucket函数。但是,我希望按工作类型对数据进行分区,以便将每个类型分组,而不考虑整个数据集。

  1. SELECT
  2. TASKTIME
  3. ,WORK_TYPE
  4. ,WIDTH_BUCKET(TASKTIME,0,100,30) AS TASKTIME_BUCKET
  5. ,WIDTH_BUCKET(TASKTIME,0,100,30) OVER (PARTITION BY WORK_TYPE) AS TASKTME_BUCKET_WT --This Errors
  6. FROM TABLE1

第一个width_bucket可以工作,但是它将整个数据集的值存储在bucket中。我试着用 OVER (PARITION BY WORK_TYPE) 但是,这会导致以下错误: ORA-00923: FROM keyword not found where expected 有什么想法吗?

lg40wkob

lg40wkob1#

如果希望每组的桶宽度相等,可以为每个group分别计算最小值和最大值:

  1. SELECT TASKTIME, WORK_TYPE,
  2. WIDTH_BUCKET(TASKTIME, 0, 100, 30) AS TASKTIME_BUCKET
  3. WIDTH_BUCKET(TASKTIME, MIN_TASKTIME, MAX_TASKTIME, 30) AS TASKTME_BUCKET_WT
  4. FROM (SELECT t1.*,
  5. MIN(TASKTIME) OVER (PARTITION BY WORK_TYPE) as MIN_TASKTIME,
  6. MAX(TASKTIME) OVER (PARTITION BY WORK_TYPE) as MAX_TASKTIME
  7. FROM TABLE1 t1
  8. ) t1

相关问题