Вопрос присоединения к SQL - PullRequest
3 голосов
/ 30 октября 2009

Вот моя ситуация:

У меня есть одна таблица, в которой содержится список проданных лекарств, содержащий НДЦ (идентификатор), проданное количество и то, является ли лекарство торговой маркой или дженериком. У меня есть другая таблица, которая содержит номера рецептов, даты и НДЦ.

Мне нужно составить список самых последних 4-х рецептурных номеров для 50 лучших непатентованных лекарств и 50 лучших фирменных лекарств.

Упрощенный пример:

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;

Что дает мне часть пути туда. Оттуда, как я могу обрезать его до 4 результатов на NDC? И возможно ли получить его в следующем:

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

Ответы [ 3 ]

1 голос
/ 30 октября 2009

Вы можете использовать комбинацию 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 столбцами.

0 голосов
/ 30 октября 2009

Это приведет вас к отдельной строке:

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

Затем пропустите результаты через фильтр в вызывающем скрипте, чтобы сгруппировать их.

0 голосов
/ 30 октября 2009

Делая некоторые предположения, и я не уверен, точный синтаксис 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...