Impala: 如何在多个where条件语句中使用count(distinct)功能?

3
我有一个健康结果数据库,我想能够在特定日期范围内查询符合特定诊断字符串的受试者数量。虚拟数据(my_table)如下所示(Date为时间戳):
subjid   Diagnosis  Date
----------------------------------------
Subj001  Z12345     2019-02-05 00:00:00
Subj001  Z12345     2017-01-10 00:00:00
Subj002  Z12345     2018-08-14 00:00:00
Subj002  Z12345     2014-03-20 00:00:00
Subj002  Z12345     2013-07-23 00:00:00
Subj003  Y56789     2016-08-16 00:00:00

在 subjid 中,每个主题可能有多个条目,每个条目都有相应的诊断代码。 到目前为止,我的查询如下:

select 
    subjid, Diagnosis, Date,
    count(subjid) over (partition by Diagnosis) as count 
from 
    my_table
where 
    Diagnosis in ('Z12345') 
    and diag_date >= '2014-01-01 00:00:00'

然而,问题在于我无法在count括号中包含一个独立的语句,因为这会返回错误。我要找的是在特定日期之后满足诊断代码字符串的唯一主题数;我对每个患者出现诊断代码字符串的次数不感兴趣。
问题:是否有一种方法可以计算在特定日期之后与特定诊断字符串匹配的每个给定主题的唯一出现总数?
解决方案需要使用Impala。谢谢提供任何建议。

1
欢迎来到StackOverflow,请问您能提供一下您问题的期望结果吗?例如,如果查询成功,您希望从提供的数据中看到什么? - PeonProgrammer
非常感谢@PeonProgrammer。本质上,我希望查询返回一个特定日期后与给定诊断代码字符串匹配的所有唯一主题的总计数(标量)。理想情况下,在计数括号中使用distinct语句可以实现此目的,但这样做会返回错误。非常感谢任何建议。 - underGlass
如果您想按日期获取唯一的结果,那么这些中的计数不都应该是1吗? - PeonProgrammer
1个回答

1
一种方法是将 dense_rank() 的总和计算出来:
select subjid, Diagnosis, Date,
       (dense_rank() over (partition by diagnosis order by subjid asc) +
        dense_rank() over (partition by diagnosis order by subjid desc)
       ) as num_subjids
from my_table
where Diagnosis in ('Z12345') and
      diag_date >= '2014-01-01 00:00:00';

非常感谢@GordonLinoff的建议;我会尝试一下并回复您。 - underGlass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接