使用 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;