2009-10-30 117 views
3

這裏是我的情況: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個最常見的「品牌」國家數據中心的列表,下面RXS是最近索賠的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 

但我寧願把它在一行。

~~~~ (如要求通過註釋:創建例如表TABLE語句):

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); 
+0

處方編號是指哪一列? – super9 2009-10-30 18:53:11

+0

RX_num =處方編號 – 2009-10-30 18:54:44

+0

您可以提供創建表語句和可能的一些插入嗎? – tuinstoel 2009-10-30 19:08:18

回答

1

您可以使用Analytics(分析)的組合(如果你是甲骨文的最近版本不夠)和一個數據透視表來做到這一點。這應該適用於你的數據集。

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條線的一條線。

+0

這個伎倆!謝謝 – 2009-10-30 20:00:00

0

使一些假設,我不知道確切的Oracle語法....但什麼:

SELECT 
    "ndc" as NDC, 
    (SELECT "rx_num" from "rx" WHERE "ndc"="drug_list"."ndc" ORDER BY "date" DESC LIMIT 1 OFFSET 0) as RX1, 
    (SELECT "rx_num" from "rx" WHERE "ndc"="drug_list"."ndc" ORDER BY "date" DESC LIMIT 1 OFFSET 1) as RX2, 
    (SELECT "rx_num" from "rx" WHERE "ndc"="drug_list"."ndc" ORDER BY "date" DESC LIMIT 1 OFFSET 2) as RX3, 
    (SELECT "rx_num" from "rx" WHERE "ndc"="drug_list"."ndc" ORDER BY "date" DESC LIMIT 1 OFFSET 3) as RX4 
FROM "drug_list" 
ORDER BY qty ASC 
LIMIT 4 

NDC | RX1 | RX2 | RX3 | RX4 
123 2332 2342 2346 7776 
+0

限制和抵消似乎並沒有爲我工作。有沒有oracle equivs? – 2009-10-30 20:02:52

+0

我在搜索Oracle equiv時找到了這個。 HTTP:// rifers。org/blogs/gbevin/2004/1/25/limit_and_offset_in_oracle – 2009-10-30 20:30:22

+0

還發現這個:SELECT column FROM table WHERE ROWNUM BETWEEN 10 AND 20,但我不確定如何將它翻譯爲LIMIT 1 OFFSET 1.它是SELECT列從表WHERE ROWNUM BETWEEN 0和1,然後增加0到1和1到2,等每個額外的查詢? – 2009-10-30 20:32:40

0

這將讓你每一個在單獨一行:

SELECT 
    `cl`.`ndc`, 
    `cl`.`rx_num` 
FROM `claims_list` AS `cl` 
WHERE `cl`.`ndc` IN 
    (
    SELECT `dl`.`ndc` FROM `drug_list` AS `dl` 
    WHERE `dl`.`type` = 'Generic' 
    ORDER BY `dl`.`qty` DESC 
    LIMIT 50 
) 
ORDER BY `cl`.`date` DESC 
LIMIT 4 

然後通過調用腳本中的篩選器運行結果以將它們組合在一起。