如何利用PL/SQL解析函数计算遗漏中值
我试图用PL/SQL编写一个分析函数,当应用于表中的一列时,该函数返回表中每一行的值,即不包括给定行的列的中位数 一个需要澄清的示例:假设我有一个包含一列X的表,该列具有以下值:如何利用PL/SQL解析函数计算遗漏中值,sql,oracle,plsql,Sql,Oracle,Plsql,我试图用PL/SQL编写一个分析函数,当应用于表中的一列时,该函数返回表中每一行的值,即不包括给定行的列的中位数 一个需要澄清的示例:假设我有一个包含一列X的表,该列具有以下值: 1 2 3 4 5 我想定义一个分析函数,以便: SELECT LOOM(X) FROM TABLE 提供以下内容: 3.5 3.5 3 2.5 2.5 i、 e.对于每行,X的中位数,不包括给定行。我一直在努力构建所需的织机功能 我不确定是否有一种聪明的方法可以做到这一点。可以使用相关子查询进行计算 假
1
2
3
4
5
我想定义一个分析函数,以便:
SELECT LOOM(X)
FROM TABLE
提供以下内容:
3.5
3.5
3
2.5
2.5
i、 e.对于每行,X的中位数,不包括给定行。我一直在努力构建所需的织机功能 我不确定是否有一种聪明的方法可以做到这一点。可以使用相关子查询进行计算 假设x值是唯一的-如您的示例中所示-
with t as (
select 1 as x from dual union all
select 2 as x from dual union all
select 3 as x from dual union all
select 4 as x from dual union all
select 5 as x from dual
)
select t.*,
(select median(x)
from t t2
where t2.x <> t.x
) as loom
from t;
编辑:
更有效的方法使用解析函数,但需要更直接地计算中值。例如:
with t as (
select 1 as x from dual union all
select 2 as x from dual union all
select 3 as x from dual union all
select 4 as x from dual union all
select 5 as x from dual
)
select t.*,
(case when mod(cnt, 2) = 0
then (case when x <= candidate_1 then candidate_2 else candidate_1 end)
else (case when x <= candidate_1 then (candidate_2 + candidate_3)/2
when x = candidate_2 then (candidate_1 + candidate_3)/2
else (candidate_1 + candidate_2) / 2
end)
end) as loom
from (select t.*,
max(case when seqnum = floor(cnt / 2) then x end) over () as candidate_1,
max(case when seqnum = floor(cnt / 2) + 1 then x end) over () as candidate_2,
max(case when seqnum = floor(cnt / 2) + 2 then x end) over () as candidate_3
from (select t.*,
row_number() over (order by x) as seqnum,
count(*) over () as cnt
from t
) t
) t
您的示例中的给定行是什么?不清楚你的函数已经完成了多少,你有什么代码要显示吗?为什么你总是假设表中有5个值,而这些值是1。。5?@CarlitosWay。这是OP提供的数据;代码对行数或行中的值没有这样的假设。如果你否决了一个正确的、经过测试的答案,那是不礼貌的。你能解释一下相关查询T的目的吗?你应该解释一下,T是在模仿示例中的表,不应该用作字面答案,这就是为什么我误解了你的解法。。。