powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Найти дубликаты пациентов имеющих одинаковый полис
10 сообщений из 10, страница 1 из 1
Найти дубликаты пациентов имеющих одинаковый полис
    #39768794
Здравствуйте. Нужно найти пациентов, которые имеют одинаковые серию и номер полиса за определенный период времени.

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

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_rozhd1Иванов Иван Иванович 4444 СЕР 55555 01.01.19901Иванов Иван Иванович 4444 СЕР 55555 01.01.19902Иванов Петр Иванович 4446 СЕР 55555 01.01.19894Петров Иван Иванович 4447 СЕР2 55345 01.01.19805Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.19456Гусев Иван Сергеевич 4478 55555000 01.01.19857Михайлов Иван Сергеевич 4479 55555000 01.01.19458Михайлов Иван Сергеевич 4480 55555000 01.01.1945

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

keyid fam im ot number seriya nomer dat_rozhd1Иванов Иван Иванович 4444 СЕР 55555 01.01.19901Иванов Иван Иванович 4444 СЕР 55555 01.01.19905Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.19456Гусев Иван Сергеевич 4478 55555000 01.01.19857Михайлов Иван Сергеевич 4479 55555000 01.01.19458Михайлов Иван Сергеевич 4480 55555000 01.01.1945
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768795
Т.е. вот так:

keyid fam im ot number seriya nomer dat_rozhd1Иванов Иван Иванович 4444 СЕР 55555 01.01.19901Иванов Иван Иванович 4444 СЕР 55555 01.01.19902Иванов Петр Иванович 4446 СЕР 55555 01.01.19895Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.19456Гусев Иван Сергеевич 4478 55555000 01.01.19857Михайлов Иван Сергеевич 4479 55555000 01.01.19458Михайлов Иван Сергеевич 4480 55555000 01.01.1945
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768796
Поле number в этом случае не важно как я указала, это номер пациента.
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768797
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НатальяСери/илиданные нерепрезентативны.
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768800
-2-, В смысле?
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768815
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НатальяСер, играйтесь:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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
;


...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768838
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

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

keyid fam im ot number seriya nomer dat_rozhd1Иванов Иван Иванович 4444 СЕР 55555 01.01.19901Иванов Иван Иванович 4444 СЕР 55555 01.01.19902Иванов Петр Иванович 4446 СЕР 55555 01.01.19895Михайлов Иван Сергеевич 4444 СЕР 55555 01.01.19456Гусев Иван Сергеевич 4478 55555000 01.01.19857Михайлов Иван Сергеевич 4479 55555000 01.01.19458Михайлов Иван Сергеевич 4480 55555000 01.01.1945

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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.
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768866
andrey_anonymousНатальяСер, играйтесь:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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. Если можно поподробнее.
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768898
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovС уважениемОтвет ради ответа не является уважением к окружающим, тем более без уточнения радикальных отличий (ser='', group by 1,2 и date '01...').
Хочешь похвастаться, хвастайся без уважения.
...
Рейтинг: 0 / 0
Найти дубликаты пациентов имеющих одинаковый полис
    #39768964
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
Вас что, муравей-пуля укусил?

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

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

За сим позвольте откланяться...
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Найти дубликаты пациентов имеющих одинаковый полис
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]