首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL唯一组合

SQL唯一组合
EN

Stack Overflow用户
提问于 2017-06-29 04:02:07
回答 2查看 62关注 0票数 2

我有一个表,它有三列,分别是一个ID、一个治疗类和一个通用名称。一个治疗类可以映射到多个通用名称。

代码语言:javascript
运行
复制
ID     therapeutic_class       generic_name
1           YG4                    insulin
1           CJ6                    maleate
1           MG9                    glargine
2           C4C                    diaoxy
2           KR3                    supplies
3           YG4                    insuilin
3           CJ6                    maleate
3           MG9                    glargine

我需要首先查看治疗类别和通用名称的单个组合,然后想要计算有多少患者具有相同的组合。我希望我的输出有三列:一列是通用名称的组合,治疗类别的组合和患者数量的组合,如下所示:

代码语言:javascript
运行
复制
Count          Combination_generic                   combination_therapeutic
2              insulin, maleate, glargine                 YG4, CJ6, MG9
1              supplies, diaoxy                           C4C, KR3
EN

回答 2

Stack Overflow用户

发布于 2017-06-29 05:26:08

根据配对(therapeutic_class, generic_name)的集合匹配患者的一种方法是在所需的输出中创建逗号分隔的字符串,并按它们分组并计数。要正确执行此操作,您需要一种方法来标识这些对。请看我在原始问题下的评论以及我对戈登答案的评论,以了解一些问题。

我在下面的解决方案中的一些初步工作中进行了这种识别。正如我在评论中提到的,如果数据模型中已经存在对和唯一ID,那就更好了;我会即时创建它们。

重要提示:这假设逗号分隔的列表不会变得太长。如果超过4000个字符(或大约32000个字符),您可以将字符串聚合到CLOB中,但不能GROUP BY CLOB(通常,不只是在这种情况下),因此这种方法将失败。一种更健壮的方法是匹配对的集合,而不是它们的一些聚合。解决方案比较复杂,除非您的问题需要,否则我不会介绍它。

代码语言:javascript
运行
复制
with
         -- Begin simulated data (not part of the solution)
         test_data ( id, therapeutic_class, generic_name ) as (
           select 1, 'GY6', 'insulin'  from dual union all
           select 1, 'MH4', 'maleate'  from dual union all
           select 1, 'KJ*', 'glargine' from dual union all
           select 2, 'GY6', 'supplies' from dual union all
           select 2, 'C4C', 'diaoxy'   from dual union all
           select 3, 'GY6', 'insulin'  from dual union all
           select 3, 'MH4', 'maleate'  from dual union all
           select 3, 'KJ*', 'glargine' from dual
         ),
         -- End of simulated data (for testing purposes only).
         -- SQL query solution continues BELOW THIS LINE
     valid_pairs ( pair_id, therapeutic_class, generic_name ) as (
       select rownum, therapeutic_class, generic_name
       from   (
                select distinct therapeutic_class, generic_name
                from   test_data
              )
     ),
     first_agg ( id, tc_list, gn_list ) as (
       select t.id, 
              listagg(p.therapeutic_class, ',') within group (order by p.pair_id),
              listagg(p.generic_name     , ',') within group (order by p.pair_id)
       from   test_data t join valid_pairs p
                           on t.therapeutic_class = p.therapeutic_class
                          and t.generic_name      = p.generic_name
       group by t.id
     )
select   count(*) as cnt, tc_list, gn_list
from     first_agg
group by tc_list, gn_list
;

输出

代码语言:javascript
运行
复制
CNT TC_LIST            GN_LIST                      
--- ------------------ ------------------------------
  1 GY6,C4C            supplies,diaoxy               
  2 GY6,KJ*,MH4        insulin,glargine,maleate     
票数 3
EN

Stack Overflow用户

发布于 2017-06-29 04:10:09

您正在寻找listagg(),然后是另一个聚合。我认为:

代码语言:javascript
运行
复制
select therapeutics, generics, count(*)
from (select id, listagg(therapeutic_class, ', ') within group (order by therapeutic_class) as therapeutics,
             listagg(generic_name, ', ') within group (order by generic_name) as generics
      from t
      group by id
     ) t
group by therapeutics, generics;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44811583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档