Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Найти дубликаты пациентов имеющих одинаковый полис / 10 сообщений из 10, страница 1 из 1
03.02.2019, 00:02
    #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
03.02.2019, 00:03
    #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
03.02.2019, 00:04
    #39768796
Найти дубликаты пациентов имеющих одинаковый полис
Поле number в этом случае не важно как я указала, это номер пациента.
...
Рейтинг: 0 / 0
03.02.2019, 00:08
    #39768797
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубликаты пациентов имеющих одинаковый полис
НатальяСери/илиданные нерепрезентативны.
...
Рейтинг: 0 / 0
03.02.2019, 00:12
    #39768800
Найти дубликаты пациентов имеющих одинаковый полис
-2-, В смысле?
...
Рейтинг: 0 / 0
03.02.2019, 02:23
    #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
03.02.2019, 10:54
    #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
03.02.2019, 12:54
    #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
03.02.2019, 14:14
    #39768898
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубликаты пациентов имеющих одинаковый полис
PolesovС уважениемОтвет ради ответа не является уважением к окружающим, тем более без уточнения радикальных отличий (ser='', group by 1,2 и date '01...').
Хочешь похвастаться, хвастайся без уважения.
...
Рейтинг: 0 / 0
03.02.2019, 19:02
    #39768964
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти дубликаты пациентов имеющих одинаковый полис
-2-
Вас что, муравей-пуля укусил?

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

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

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


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