【问题标题】:Calculate median in a SQL query using different tables使用不同的表计算 SQL 查询中的中位数
【发布时间】:2014-03-07 11:48:23
【问题描述】:

我必须计算(Oracle)某些人年龄的中位数,但要获得年龄我必须在不同的表中搜索,所以为其他问题提供的解决方案对我没有帮助。

我有 4 个表,我必须加入这些表才能获取所选人员的年龄,然后计算中位数。

我获取年龄的查询类似于:

select p.year_born from patient p
where p.id in (
select distinct md.patient_id
from main_data md, treatment t, patient p, consultation c
where 1 = 1
and t.md_id = md.id 
and md.type = 'SOME_TYPE'
and c.id = p.consultation_id
and md.deleted = 0
and t.deleted = 0
and md.completed = 1
and md.patient_id = p.id
and c.testconsultation = 0);

我如何计算人们出生年份的中位数?

【问题讨论】:

    标签: sql oracle median


    【解决方案1】:

    试试这个查询:

    WITH 
    t1 as  (SELECT year_born FROM (select TO_NUMBER(p.year_born) year_born from patient p
           where p.id in (
           select distinct md.patient_id
           from main_data md, treatment t, patient p, consultation c
           where 1 = 1
           and t.md_id = md.id 
           and md.type = 'SOME_TYPE'
           and c.id = p.consultation_id
           and md.deleted = 0
           and MLP.deleted = 0
           and md.completed = 1
           and md.patient_id = p.id
           and c.testconsultation = 0)) order by year_born),
    t2 as (SELECT mod(count(year_born),2) as mod_num,count(year_born) as num FROM t1),
    t3 as (SELECT ROWNUM r,t1.* FROM t1),
    t4 as (SELECT CASE WHEN mod_num = 1 then round(num/2) else -1 end as t4_num FROM t2)
    SELECT CASE WHEN t4.t4_num = -1 then ((SELECT year_born FROM t3 where r = (t2.num/2)) +
    (SELECT year_born FROM t3 where r = (t2.num/2) + 1)) / 2 ELSE (SELECT year_born FROM t3 where r = t4_num) end as final_num
    FROM t4,t2;
    

    【讨论】:

    • 嗯,这与我使用 Java 获得的结果匹配,但它与使用 Oracle Median() 获得的结果不匹配......这很奇怪......
    • 我确定这个查询返回median我的朋友,只是问题可能是由于排序而发生的。我现在更改查询。
    【解决方案2】:

    答案很简单:

    select median (2014 - p.year_born) from patient p
    where p.id in (
    select distinct md.patient_id
    from main_data md, treatment t, patient p, consultation c
    where 1 = 1
    and t.md_id = md.id 
    and md.type = 'SOME_TYPE'
    and c.id = p.consultation_id
    and md.deleted = 0
    and t.deleted = 0
    and md.completed = 1
    and md.patient_id = p.id
    and c.testconsultation = 0);
    

    我应该在问之前阅读 Oracle 文档...

    【讨论】:

    猜你喜欢
    • 2021-02-26
    • 2023-03-20
    • 2016-01-24
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多