使用不同的表计算SQL查询中的中值
我必须计算(Oracle)一些人的年龄中位数,但要得到年龄,我必须在不同的表格中搜索,因此为其他问题提供的解决方案对我没有帮助 我有4个表,我必须加入其中,以获得所选人员的年龄,然后计算中位数 获取年龄的查询如下所示:使用不同的表计算SQL查询中的中值,sql,oracle,median,Sql,Oracle,Median,我必须计算(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 wh
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);
我如何计算这些人出生年份的中位数?试试这个查询:
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;
请尝试以下查询:
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;
答案很简单:
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文档…答案很简单:
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文档,然后再询问……这与我使用Java获得的结果相匹配,但与使用Oracle Median()获得的结果不匹配。。。这是非常奇怪的…我确信这个查询返回
media
我的朋友,只是可能是因为排序问题发生了。我现在更改了查询。这与我使用Java获得的结果相匹配,但与使用Oracle media()获得的结果不匹配。。。这是非常奇怪的…我确信这个查询返回median
my friend,只是可能是因为排序问题发生了。我现在将查询更改为+1以读取文档:)。+1以读取文档:)。