加入 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
我将列名 "start" 和 "end" 重命名为 "tstart"、"tend",因为这些是 Oracle 保留字。
我有三个 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
我将列名 "start" 和 "end" 重命名为 "tstart"、"tend",因为这些是 Oracle 保留字。