使用 Oracle SQL Developer v19 的查询中的平均日期列
Average Date column in a query using Oracle SQL Developer v19
我有一个查询,结果显示一列年龄,该年龄是根据 'Date' 数据类型字段计算得出的。我想为所有符合条件的记录添加平均年龄。
我一直在搜索 google 但没有成功,当我尝试转换时出现无效数据类型错误
如有任何帮助,我们将不胜感激
SELECT P.First_name, P.Last_name, P.Sex, P.Ethnicity,
Round((sysdate - P.D_O_B) / 365,0) as Age,
CAST( AVG(CAST(CAST(P.D_O_B as DateTime) as Float)) as DateTime)
From Patient P, Tests T
where T.Patient_ID = P.NHS_Number
and T.Result = 'Positive'
and T.date_of_test + 14 > SYSDATE
Group by P.first_name, P.Last_Name, P.Sex, P.Ethnicity, P.D_O_B
Order by Age desc;
下面是一个示例,说明我在计算平均年龄时没有失败
您似乎想要一个 window 函数:
select P.First_name, P.Last_name, P.Sex, P.Ethnicity,
Round((sysdate - P.D_O_B) / 365,0) as Age,
round(avg((sysdate - P.D_O_B) / 365, 0) over (), 0) as avg_age
From Patient P join
Tests T
on T.Patient_ID = P.NHS_Number
where T.Result = 'Positive' and
T.date_of_test + 14 > SYSDATE
Group by P.first_name, P.Last_Name, P.Sex, P.Ethnicity, P.D_O_B
Order by Age desc;
请注意,我还修复了您的陈旧连接语法。
确实,window 函数函数可能就是您所追求的,正如 Gordon Linoff 指出的那样。使用标准连接也是必须的。
但是,我建议还修复日期算法;并非所有年份都有 365 天,因此您的查询在闰年时关闭 - 当一个人变老时,不准确度会增加。相反,我会推荐 months_between()
:
select p.first_name, p.last_name, p.sex, p.ethnicity,
round(months_between(sysdate, p.d_o_b) / 12, 0) as age,
round(avg(months_between(sysdate, p.d_o_b) / 12) over(), 0) as avg_age
from patient p
inner join tests t on t.patient_id = p.nhs_number
where t.result = 'positive' and t.date_of_test + 14 > sysdate
group by p.first_name, p.last_name, p.sex, p.ethnicity, p.d_o_b
order by age desc;
我有一个查询,结果显示一列年龄,该年龄是根据 'Date' 数据类型字段计算得出的。我想为所有符合条件的记录添加平均年龄。
我一直在搜索 google 但没有成功,当我尝试转换时出现无效数据类型错误
如有任何帮助,我们将不胜感激
SELECT P.First_name, P.Last_name, P.Sex, P.Ethnicity,
Round((sysdate - P.D_O_B) / 365,0) as Age,
CAST( AVG(CAST(CAST(P.D_O_B as DateTime) as Float)) as DateTime)
From Patient P, Tests T
where T.Patient_ID = P.NHS_Number
and T.Result = 'Positive'
and T.date_of_test + 14 > SYSDATE
Group by P.first_name, P.Last_Name, P.Sex, P.Ethnicity, P.D_O_B
Order by Age desc;
下面是一个示例,说明我在计算平均年龄时没有失败
您似乎想要一个 window 函数:
select P.First_name, P.Last_name, P.Sex, P.Ethnicity,
Round((sysdate - P.D_O_B) / 365,0) as Age,
round(avg((sysdate - P.D_O_B) / 365, 0) over (), 0) as avg_age
From Patient P join
Tests T
on T.Patient_ID = P.NHS_Number
where T.Result = 'Positive' and
T.date_of_test + 14 > SYSDATE
Group by P.first_name, P.Last_Name, P.Sex, P.Ethnicity, P.D_O_B
Order by Age desc;
请注意,我还修复了您的陈旧连接语法。
确实,window 函数函数可能就是您所追求的,正如 Gordon Linoff 指出的那样。使用标准连接也是必须的。
但是,我建议还修复日期算法;并非所有年份都有 365 天,因此您的查询在闰年时关闭 - 当一个人变老时,不准确度会增加。相反,我会推荐 months_between()
:
select p.first_name, p.last_name, p.sex, p.ethnicity,
round(months_between(sysdate, p.d_o_b) / 12, 0) as age,
round(avg(months_between(sysdate, p.d_o_b) / 12) over(), 0) as avg_age
from patient p
inner join tests t on t.patient_id = p.nhs_number
where t.result = 'positive' and t.date_of_test + 14 > sysdate
group by p.first_name, p.last_name, p.sex, p.ethnicity, p.d_o_b
order by age desc;