SQL加入问题

前端之家收集整理的这篇文章主要介绍了SQL加入问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的情况:

我有一张表,其中包含销售的药品清单,其中包含NDC(标识符),销售数量以及药品是品牌名称还是通用名称.我有另一张表,其中包含处方号,日期和NDC.

我需要生成前50种仿制药和前50种品牌药的最新4个处方号列表.

简化示例:

Drug_list:
NDC   QTY      Type
123   50       Generic
125   47       Brand
128   34       Generic
...
549   1        Brand
294   1        Generic

Claims_list:
NDC  RX_num  Date
123  1234    20081027
123  4194    20090517
594  12598   20091012

我如何编写连接以生成列表

NDC RX1,RX2,RX3,RX4

NDC是50个最常见的“品牌”NDC,以下RX是最近声称的RX号码?

~~~~~~~

到目前为止,我有这个:

select t.ndc,cl.rx,cl.date from (
select * from (
select * from (
select * from drug_list where brand = 'Generic')
order by qty)
where rownum < 51) t
join claims_list cl on cl.ndc = t.ndc
order by t.ndc,cl.date;

这让我成为那里的一部分.从那里,我如何将其削减到每个NDC只有4个结果?并且,是否可以通过以下方式获得它:

NDC,RX1,RX4

如果我必须报告为:

NDC1,RX1
NDC1,RX2
NDC1,RX3
NDC1,RX4
NDC2,RX1
NDC2,RX2
NDC2,RX3
NDC2,RX4
NDC3,RX1
... etc

但我更愿意把它放在一条线上.

~~~~
(根据注释的要求:为表格表创建表语句):

create table drug_list
(NDC varchar2(15),QTY number,type varchar2(10));

create table claims_list
(NDC varchar2(15),RX_num varchar2(20),"date" date);

解决方法

您可以结合使用Google Analytics(如果您使用的是最近的Oracle版本)和数据透视表来完成此操作.这应该适用于您的数据集.
select ndc,max(decode(rn,1,rx_num,null)) rx1,2,null)) rx2,3,null)) rx3,4,null)) rx4
  from (select *
          from (select claims_list.ndc,claims_list.rx_num,row_number() over (partition by claims_list.ndc order by claims_list.date desc) rn
                  from claims_list,(select * 
                          from (select *
                                  from drug_list
                                 where type = 'Generic'
                                order by qty desc
                               )
                         where rownum < 51
                       ) drug_list
                 where drug_list.ndc = claims_list.ndc
               )
         where rn < 5
        order by ndc,rn
       )
group by ndc;

内部查询使用分析根据索赔日期为每种药物提取最新的4个rx数字.然后我们使用一个支点将它从每个药物的4行带到4行的一行.

猜你在找的MsSQL相关文章