sql - Impala:计数(不同)具有多个 where 语句标准?
问题描述
我有一个健康结果数据库,我希望能够在其中查询在特定日期范围内满足特定诊断字符串的受试者计数。虚拟数据 ( 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'
但是,问题是我不能在计数的括号中包含不同的语句,因为这会返回错误。我正在寻找的是在特定日期之后满足诊断代码字符串的唯一主题的数量;我对每个患者出现多少次诊断代码字符串不感兴趣。
问题:有没有办法计算在特定日期之后与特定诊断字符串匹配的每个给定主题的唯一出现的总数?
解决方案需要在 Impala 中。在此先感谢您的任何建议。
解决方案
一种方法是dense_rank()
s 的总和:
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';
推荐阅读
- java - 找到多个文件,其独立于操作系统的路径为“META-INF/INDEX.LIST”
- angularjs - 如何在 Angular js 材料中分别抛出表单错误?
- unit-testing - 我什么时候应该觉得我的单元测试已经完成了?
- docker - 注册表在哪里运行
- java - 如何使用 java 8 迭代 JsonArray
- dll - 在输出 DLL 中设置 APP.config
- html - 无法将 url 读取为 JSON 数据
- gcc - 有人在 OpenBSD 6.3 上构建过 gcc 8.2.0 吗?
- knockout.js - 表格上的下拉菜单,允许每行仅选择一次项目
- java - Jenkins/Groovy - 对于数组中的每个项目,使用项目中的变量执行 shell 脚本