加入 2 tables,同时获得一个 table 值的第 90 个百分位数

Joining 2 tables while getting the 90th percentile of one table's values

我有三个 table 需要处理。 这些是示例 tables.

我想根据“中的数据”获取 STTR table 中每个“操作”的第 90 个百分位数'列。 而且我也只想在一段时间内。 对于这个要求,我写了这个查询。

select DISTINCT STTR.OPERATION , 
        PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY STTR.VAL ASC)
        OVER (PARTITION BY STTR.OPERATION) 
         as "90th Percentile"
        from STTR
 WHERE STTR.TIME > (SELECT EXE.START FROM EXE WHERE EXE.ID = 1001) 
 AND
 STTR.TIME < (SELECT EXE.END FROM EXE WHERE EXE.ID = 1001)

这为我提供了一个包含操作列表及其第 90 个百分位数的结果。像这样

现在我想将 TSS table 的列也添加到这个结果中并得到这种结果。

我尝试加入两个 table,但是当我用 where 子句添加百分位数计算部分时,它给了我 sql 个错误。

ORA-00913: too many values
00913. 00000 -  "too many values"
*Cause:    
*Action:
Error at Line: 12 Column: 10

这是我厌倦的方法。

SELECT  TSS.ID,
        TSS.STEP,
        TSS.VAL1,
        TSS.VAL2,
        TSS.VAL3,
        (select DISTINCT STTR.OPERATION , PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY STTR.VAL ASC)
        OVER (PARTITION BY STTR.OPERATION) 
         as "90th Percentile"
        from STTR
       WHERE STTR.TIME > (SELECT EXE.START FROM EXE WHERE EXE.ID = 1001) 
 AND
 STTR.TIME < (SELECT EXE.END FROM EXE WHERE EXE.ID = 1001))
      as Percentile                  
FROM TSS
JOIN STTR on STTR.OPERATION = TSS.STEP
WHERE TSS.ID = 1001;

这个结果是否可能实现,如果可以,你能指导我如何实现它吗?

错误是因为您不能在 select 子查询中 select 2 列。通过将子查询移动到 from 子句来尝试此操作:

SELECT  TSS.ID,
        TSS.STEP,
        TSS.VAL1,
        TSS.VAL2,
        TSS.VAL3,
        t2.operation, 
        t2.percentile
FROM TSS, 
(select DISTINCT STTR.OPERATION , PERCENTILE_DISC(0.9), 
WITHIN GROUP (ORDER BY STTR.VAL ASC)
        OVER (PARTITION BY STTR.OPERATION) 
         as percentile
        from STTR) t2
JOIN STTR on t2.OPERATION = TSS.STEP
WHERE TSS.ID = 1001;

试试这个查询,它为你的示例提供了我想要的输出。

select distinct sttr.operation, tss.val1, tss.val2, tss.val3,
    percentile_disc(0.9) within group (order by sttr.val asc) 
      over (partition by sttr.operation) as "90th Percentile"
  from sttr 
    join exe on exe.tstart < sttr.time and sttr.time < exe.tend
    join tss on sttr.operation = tss.step
  where exe.id = 1001 
  order by operation

SQLFiddle

我将列名 "start" 和 "end" 重命名为 "tstart"、"tend",因为这些是 Oracle 保留字。