Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Найти дубликаты пациентов имеющих одинаковый полис  [new]
НатальяСер
Member

Откуда:
Сообщений: 14
Здравствуйте. Нужно найти пациентов, которые имеют одинаковые серию и номер полиса за определенный период времени.

Есть таблицы:

1. patient с полями: keyid, number, fam, im, ot, dat_rozhd
2. police с полями keyid, seriya, nomer, patientid
3. posechenie с полями keyid, date_pos (дата посещения), patientid

Один пациент может иметь несколько полисов (police). Т.е. в таблице police может быть несколько записей, которые ссылаются на одного пациента.

Нужно в итоге найти всех пациентов, которые имеют один и тот же полис за период (поле date_pos) с 01.01.2019 по 31.01.2019

Например. Может быть такая ситуация:

keyid fam im ot number seriya nomer dat_rozhd
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
2Иванов Петр Иванович 4446 СЕР 55555 01.01.1989
4Петров Иван Иванович 4447 СЕР2 55345 01.01.1980
5Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.1945
6Гусев Иван Сергеевич 4478 55555000 01.01.1985
7Михайлов Иван Сергеевич 4479 55555000 01.01.1945
8Михайлов Иван Сергеевич 4480 55555000 01.01.1945


Видим что первые две записи и 5 запись имеют один и тот же полис и серию. А также 6, 7, 8 пациенты имеют один и тот же номер полиса, а серия пустая у них. Нужно вывести только тех пациентов, у которых серия и/или полис одинаковый. Т.е. в данном случае так:

keyid fam im ot number seriya nomer dat_rozhd
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
5Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.1945
6Гусев Иван Сергеевич 4478 55555000 01.01.1985
7Михайлов Иван Сергеевич 4479 55555000 01.01.1945
8Михайлов Иван Сергеевич 4480 55555000 01.01.1945
3 фев 19, 00:02    [21800617]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
НатальяСер
Member

Откуда:
Сообщений: 14
Т.е. вот так:

keyid fam im ot number seriya nomer dat_rozhd
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
2Иванов Петр Иванович 4446 СЕР 55555 01.01.1989
5Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.1945
6Гусев Иван Сергеевич 4478 55555000 01.01.1985
7Михайлов Иван Сергеевич 4479 55555000 01.01.1945
8Михайлов Иван Сергеевич 4480 55555000 01.01.1945
3 фев 19, 00:03    [21800618]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
НатальяСер
Member

Откуда:
Сообщений: 14
Поле number в этом случае не важно как я указала, это номер пациента.
3 фев 19, 00:04    [21800619]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
-2-
Member

Откуда:
Сообщений: 14504
НатальяСер
и/или
данные нерепрезентативны.
3 фев 19, 00:08    [21800620]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
НатальяСер
Member

Откуда:
Сообщений: 14
-2-, В смысле?
3 фев 19, 00:12    [21800623]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17182
НатальяСер, играйтесь:
+
with patient(keyid, "NUMBER", fam, im, ot, dat_rozhd) as (select 1, 4444, 'Иванов','Иван','Иванович',date'1990-01-01'
from dual union all select 2, 4446, 'Иванов','Петр','Иванович',date'1989-01-01'
from dual union all select 4, 4447, 'Петров','Иван','Иванович',date'1980-01-01'
from dual union all select 5, 4448, 'Михайлов','Иван','Сергеевич',date'1945-01-01'
from dual union all select 6, 4478, 'Гусев','Иван','Сергеевич',date'1985-01-01'
from dual union all select 8, 4480, 'Михайлов','Иван','Сергеевич',date'1945-01-01'
from dual)
, police (keyid, seriya, nomer, patientid) as (select 1, 'СЕР', '55555', 1
from dual union all select 2, 'СЕР', '55555', 2
from dual union all select 3, 'СЕР', '55555', 5
from dual union all select 4, 'СЕР2', '55345', 4
from dual union all select 5, '', '55555000', 6
from dual union all select 6, '', '55555000', 5
from dual union all select 7, '', '55555000', 8
from dual)
, posechenie(keyid, date_pos /*(дата посещения)*/, patientid) as (select 1, date'2019-01-01', 1
from dual union all select 2, date'2019-01-02', 1
from dual union all select 3, date'2019-01-03', 2
from dual union all select 4, date'2019-01-04', 5
from dual union all select 5, date'2019-01-05', 4
from dual union all select 6, date'2019-01-06', 6
from dual union all select 7, date'2019-01-07', 7
from dual union all select 8, date'2019-01-08', 8
from dual)
---------------------< Сut here >----------------------------
select keyid, fam, im, ot, "NUMBER", seriya, nomer, dat_rozhd
  from (
    select patient.keyid, patient.fam, patient.im, patient.ot, patient."NUMBER"
         , police.seriya, police.nomer, patient.dat_rozhd
         , count(distinct police.patientid) over(partition by police.seriya, police.nomer) f
      from police, patient, posechenie
    where police.patientid=patient.keyid
      and posechenie.patientid=patient.keyid
      and posechenie.date_pos between date'2019-01-01' and date'2019-01-31'
       ) where f > 1
;

3 фев 19, 02:23    [21800657]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
Polesov
Member

Откуда:
Сообщений: 551
Привет.

НатальяСер
Т.е. вот так:

keyid fam im ot number seriya nomer dat_rozhd
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
1Иванов Иван Иванович 4444 СЕР 55555 01.01.1990
2Иванов Петр Иванович 4446 СЕР 55555 01.01.1989
5Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.1945
6Гусев Иван Сергеевич 4478 55555000 01.01.1985
7Михайлов Иван Сергеевич 4479 55555000 01.01.1945
8Михайлов Иван Сергеевич 4480 55555000 01.01.1945


with CTE as (
select pa.KEYID,
       pa.FAM,
       pa.IM,
       pa.OT,
       po.SERIYA,
       po.NOMER,
       pa.DAT_ROZHD
  from PATIENT pa
  join POLICE po on ( po.PATIENTID = pa.KEYID )
  join POSECHENIE vi on ( vi.PATIENTID = pa.KEYID )
where vi.DATE_POS between date '01.01.2019' and date '31.01.2019' ),

     GTE as (
select SERIYA, NOMER
  from CTE
 group by 1, 2
having count(*) > 1 )

select CTE.*
  from CTE
  join GTE on ( GTE.SERIYA = CTE.SERIYA and GTE.NOMER = CTE.NOMER )


P.S. Firebird, Oracle нету

С уважением, Polesov.
3 фев 19, 10:54    [21800697]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
НатальяСер
Member

Откуда:
Сообщений: 14
andrey_anonymous
НатальяСер, играйтесь:
+
with patient(keyid, "NUMBER", fam, im, ot, dat_rozhd) as (select 1, 4444, 'Иванов','Иван','Иванович',date'1990-01-01'
from dual union all select 2, 4446, 'Иванов','Петр','Иванович',date'1989-01-01'
from dual union all select 4, 4447, 'Петров','Иван','Иванович',date'1980-01-01'
from dual union all select 5, 4448, 'Михайлов','Иван','Сергеевич',date'1945-01-01'
from dual union all select 6, 4478, 'Гусев','Иван','Сергеевич',date'1985-01-01'
from dual union all select 8, 4480, 'Михайлов','Иван','Сергеевич',date'1945-01-01'
from dual)
, police (keyid, seriya, nomer, patientid) as (select 1, 'СЕР', '55555', 1
from dual union all select 2, 'СЕР', '55555', 2
from dual union all select 3, 'СЕР', '55555', 5
from dual union all select 4, 'СЕР2', '55345', 4
from dual union all select 5, '', '55555000', 6
from dual union all select 6, '', '55555000', 5
from dual union all select 7, '', '55555000', 8
from dual)
, posechenie(keyid, date_pos /*(дата посещения)*/, patientid) as (select 1, date'2019-01-01', 1
from dual union all select 2, date'2019-01-02', 1
from dual union all select 3, date'2019-01-03', 2
from dual union all select 4, date'2019-01-04', 5
from dual union all select 5, date'2019-01-05', 4
from dual union all select 6, date'2019-01-06', 6
from dual union all select 7, date'2019-01-07', 7
from dual union all select 8, date'2019-01-08', 8
from dual)
---------------------< Сut here >----------------------------
select keyid, fam, im, ot, "NUMBER", seriya, nomer, dat_rozhd
  from (
    select patient.keyid, patient.fam, patient.im, patient.ot, patient."NUMBER"
         , police.seriya, police.nomer, patient.dat_rozhd
         , count(distinct police.patientid) over(partition by police.seriya, police.nomer) f
      from police, patient, posechenie
    where police.patientid=patient.keyid
      and posechenie.patientid=patient.keyid
      and posechenie.date_pos between date'2019-01-01' and date'2019-01-31'
       ) where f > 1
;



Подскажите пожалуйста, а что делает строчка , count(distinct police.patientid) over(partition by police.seriya, police.nomer) f. Если можно поподробнее.
3 фев 19, 12:54    [21800732]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
-2-
Member

Откуда:
Сообщений: 14504
Polesov
С уважением
Ответ ради ответа не является уважением к окружающим, тем более без уточнения радикальных отличий (ser='', group by 1,2 и date '01...').
Хочешь похвастаться, хвастайся без уважения.
3 фев 19, 14:14    [21800772]     Ответить | Цитировать Сообщить модератору
 Re: Найти дубликаты пациентов имеющих одинаковый полис  [new]
Polesov
Member

Откуда:
Сообщений: 551
-2-
Вас что, муравей-пуля укусил?

-2-
Ответ ради ответа
Помилуйте, сударь, какой ответ ради ...
Человек задал вопрос - было интересно его решить, чем и поделился.

-2-
Хочешь похвастаться
Не стоит судить по себе.

За сим позвольте откланяться...
3 фев 19, 19:02    [21800875]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить