这是我的情况:

我有一个表,其中包含一列包含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, RX2, RX3, 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);

最佳答案

您可以结合使用Analytics(分析)(如果您使用的是最新版本的Oracle)和数据透视表来完成此操作。这应该与您的数据集一起使用。

select ndc,
       max(decode(rn, 1, rx_num, null)) rx1,
       max(decode(rn, 2, rx_num, null)) rx2,
       max(decode(rn, 3, rx_num, null)) rx3,
       max(decode(rn, 4, rx_num, 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列的一行。

08-07 06:32