如何利用PL/SQL解析函数计算遗漏中值

如何利用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的中位数,不包括给定行。我一直在努力构建所需的织机功能 我不确定是否有一种聪明的方法可以做到这一点。可以使用相关子查询进行计算 假

我试图用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的中位数,不包括给定行。我一直在努力构建所需的织机功能

我不确定是否有一种聪明的方法可以做到这一点。可以使用相关子查询进行计算

假设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是在模仿示例中的表,不应该用作字面答案,这就是为什么我误解了你的解法。。。