繁体   English   中英

如何在不同条件下获得不同的计数

[英]How to get distinct count along with different conditions

我的数据看起来像这样在此处输入图像描述

我有 4 个不同的结果类别:正常、轻度、中度和重度

我想获取每个类别的患者数量,如果是严重类别,我想根据其相应的结果值(例如,Severe_500_to_599、Severe_600_to_699、Severe_700_to_799 和severe_>800)进一步将其划分为更多类别,然后获取计数这些子类别。

所以我的结果应该是这样的, 在此处输入图像描述

目前我正在通过提出具体条件来进行个人计数,

select count(distinct SOURCE_PATIENT_ID)
from Table1
where RESULT_CATEGORY = 'SEVERE' and RESULT_VALUE_STANDARDIZED between '1100' and '1199' and RESULT_UNIT <> 'MG/DL';

有没有办法在一个查询中获得所有结果?

谢谢!

您可以使用 Union all 来组合您的查询

select  'SEVERE-599' as ResultCategory,
        count(distinct SOURCE_PATIENT_ID)
from Table1
where RESULT_CATEGORY = 'SEVERE' and RESULT_VALUE_STANDARDIZED between '500' and '599' and RESULT_UNIT <> 'MG/DL'
Union ALL
select  'SEVERE-699' as ResultCategory,
        count(distinct SOURCE_PATIENT_ID)
from Table1
where RESULT_CATEGORY = 'SEVERE' and RESULT_VALUE_STANDARDIZED between '600' and '699' and RESULT_UNIT <> 'MG/DL'

此处可以使用带有QUALIFY子句的 Window function 将数据集划分为单独的桶,然后从这些桶中获取单个值。

以下查询 -

with data (patient_id, result_category, result_value) as (
select * from values 
(110,'Normal',35),
(123,'Normal',135),
(111,'Mild',151),
(191,'Mild',199),
(112,'Moderate',211),
(113,'Severe',501),
(115,'Severe',500),
(144,'Severe',723),
(146,'Severe',801)
)
select 
case 
    when result_category = 'Severe' 
        AND result_value between 500 and 599 
    then 
        'Severe Bucket (500-599)' 
    when result_category = 'Severe' 
        AND result_value between 700 and 799 
    then 
        'Severe Bucket (700-799)' 
    when result_category = 'Severe' 
        AND result_value between 800 and 899 
    then 
        'Severe Bucket (800-899)' 
    else 
        result_category
end new_result_category, 
sum(result_value) over (partition by new_result_category) patient_count 
from data
qualify row_number() over (partition by new_result_category 
order by patient_id desc) = 1;

将给出如下结果 -

NEW_RESULT_CATEGORY PATIENT_COUNT 个
温和的 350
缓和 211
严重铲斗 (700-799) 723
严重铲斗 (500-599) 1001
普通的 170
严重铲斗 (800-899) 801

我可以建议被低估的grouping sets吗?

with cte as

(select *, case when result_value between 500 and 599  then 'Severe Bucket (500-599)' 
                when result_value between 700 and 799 then  'Severe Bucket (700-799)' 
                when result_value between 800 and 899 then 'Severe Bucket (800-899)' 
           end as breakdown
 from data)

select coalesce(result_category,breakdown) as category,
       count(distinct patient_id) as patient_count 
from cte
group by grouping sets (result_category,breakdown)
having coalesce(result_category,breakdown) is not null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM