Нахождение количества детей в реанимации с помощью SQL

У меня есть БОЛЬШОЙ:

 | name |surname| date_of_birth |hospital| op_id | op_date | medical_branch | 
 |++++++|+++++++|+++++++++++++++|++++++++|+++++++|+++++++++|++++++++++++++++|
 |      |       |               |        |       |         |                |

Это таблица с записями медицинских операций примерно в 500 больницах за год. Около 300 миллионов строк.

Мой вопрос:

В каждой больнице X сколько детей родилось и скольким из них была оказана реанимация сразу (в тот же день) после рождения в той же больнице?

Например, в больнице А родилось 100 детей, и 20 из них были доставлены в реанимацию в один и тот же день в той же больнице.

P619920 – это идентификатор операции для рождения. Для рождения записывается идентификатор матери, а не ребенка.

I552015 — идентификатор операции для интенсивной терапии. Записывается информация об идентификаторе ребенка.

Во-первых, я изолировал больницу А:

create table hospital_A as ( select * from BIGTABLE where hospital = 'A' ) 

Шаблон Hospital_A выглядит так:

| name  |surname| date_of_birth|hospital| op_id |  op_date  |  medical_branch  | 
|+++++++|+++++++|++++++++++++++|++++++++|+++++++|+++++++++++|+++++++++++++++++ |
| Mary  | White |  01.02.1981  |   A    |P619920| 09.12.2011|   Gynecology     |
| John  | White |  09.12.2011  |   A    |I552015| 09.12.2011|Infantile diseases|

Я пытался соответствовать:

а) фамилии ребенка и матери

б) даты операции.

select distinct
 t.name
,t.surname
,t.op_date
,t.op_id
,t.medical_branch
,v.name
,v.surname
--,v.op_id
,v.medical_branch
,v.date_of_birth
,v.hospital
from hospital_A t, hospital_A v
where t.op_date=v.date_of_birth
and t.surname=v.surname
and t.op_id = 'P619920'
and v.op_id = 'I552015'

Это дало мне 20 строк.

Но когда я применяю тот же запрос к BIFTABLE, для больницы А имеется 81 строка.

Я понимаю, что эта разница связана с детьми, которые родились в других больницах, но были доставлены в больницу А в тот же день для интенсивной терапии.

В BIGTABLE шаблон выглядит так:

| name  |surname|date_of_birth|hospital|  op_id  | op_date  |  medical_branch  | 
|+++++++|+++++++|+++++++++++++|++++++++|+++++++++|++++++++++|++++++++++++++++++|
| Mary  | White | 01.02.1981  |   A    | P619920 |09.10.2011|   Gynecology     |
| John  | White | 09.10.2011  |   A    | I552015 |09.10.2011|Infantile diseases|
| Ellen | Young | 04.09.1978  |   B    | P619920 |07.12.2011|   Gynecology     |
| Robert| Young | 07.12.2011  |   A    | I552015 |07.12.2011|Infantile diseases|

Таким образом, результаты таблицы BIGTABLE отличаются от результатов изолированной таблицы Hospital_A, так как она содержит Hospital B.

Мой запрос для BIGTABLE должен извлечь комбинацию родов в тот же день и интенсивной терапии, которая произошла в той же больнице.

Результирующая таблица:

 | hospital | total births | intensive_care_babies |
 |----------|--------------|-----------------------|
 |     A    |     100      |        20             |
 |     B    |     ...      |        ..             |

person bonsvr    schedule 15.12.2011    source источник
comment
Разве нет лучшей связи между матерью и ребенком? Использование имени в качестве критерия соответствия довольно плохо, потому что фамилия не уникальна. Одновременно может быть несколько матерей с одинаковой фамилией.   -  person Daniel Hilgarth    schedule 15.12.2011
comment
вам следует изменить свой титул, потому что мы можем быть экспертами в sql, но не в больничных вещах...   -  person remi bourgarel    schedule 15.12.2011
comment
Я предполагаю, что во многих (западных?) странах это даже просто неправильно. Я знаю только одного ребенка из всего моего списка друзей, у которого ребенку дали ту же фамилию, что и его матери [потому что не было «официального» отца]; во всех остальных случаях используется фамилия отца, поэтому запрос в его текущей форме будет отфильтровывать 99% всех случаев. Просто полагаться на date_of_birth = op_date (и в той же больнице?) было бы еще не идеально, но все же НАМНОГО ближе к истине, я думаю.   -  person deroby    schedule 15.12.2011
comment
Кажется, что в этой таблице нет идеальной связи между матерями и младенцами (а как насчет близнецов? что насчет еще не названного имени?). Другой проблемой было бы понятие того же дня - является ли полночь резкой границей? Роды в 23:55 и реанимация в 0:05 не будут считаться одним и тем же днем?   -  person Konstantin Pribluda    schedule 15.12.2011
comment
Использование имени для сопоставления не идеально, однако оно дает разумный результат и является лучшим доступным вариантом. И время не имеет значения, так как лечебные операции фиксируются не одновременно, а в конце следующего дня.   -  person bonsvr    schedule 16.12.2011


Ответы (3)


Просто добавьте условие, что обе строки должны быть из одной больницы:

and t.hospital = v.hospital

Кстати, в вашем заявлении отсутствует еще одно условие. Вы проверяете, совпадает ли дата ОП матери с датой рождения ребенка. Вы используете это, чтобы сопоставить ребенка с его матерью. Но вы забыли проверить, совпадает ли дата ОП ребенка с датой его рождения. Это условие требуется для получения только младенцев, которые отправляются в реанимацию в день их рождения.


Чтобы ответить на вопрос в вашем комментарии:

select
    b.hospital,
    count(b.surname) as total_births,
    count(i.surname) as intensive_care_babies,
from
    bigtable b,
    left outer join bigtable i
      on  b.surname = i.surname
      and b.op_date = i.date_of_birth
      and b.op_id = 'P619920'
      and i.op_id = 'I552015'
      and b.hospital = i.hospital
group by
    b.hospital
;
person Daniel Hilgarth    schedule 15.12.2011
comment
Хороший вопрос. Как найти общее количество рождений и количество реанимаций в одном запросе? - person bonsvr; 16.12.2011
comment
Я попробовал это на образце таблицы с 750000 строками, но план выполнения сошел с ума. Вот оно. - person bonsvr; 17.12.2011

В дополнение к больнице присоединяйтесь к имени в дополнение к фамилии или, что еще лучше, к личному идентификатору, если он у вас есть. При таком количестве строк почти гарантированно будут лица с одинаковыми именами и фамилиями.

person Chris    schedule 15.12.2011
comment
Присоединиться по имени не получится, потому что имя матери отличается от имени ребенка. - person Daniel Hilgarth; 15.12.2011
comment
Ах, думаю с моей стороны - спасибо. Но регистрация только по фамилии наверняка даст вам несколько ложных срабатываний в любой крупной больнице. Вероятно, с этим ничего не поделаешь, если нет явных отношений между матерью и ребенком. (Кстати, в Германии фамилию ребенка == фамилии матери предположение часто было бы неправильным). - person Chris; 15.12.2011
comment
Я согласен с вами по поводу этой проблемы и уже поднимал этот вопрос в комментарии к вопросу. :) - person Daniel Hilgarth; 15.12.2011

person    schedule
comment
Что это должно делать? Примечание. Имя матери не совпадает с именем ребенка. - person Daniel Hilgarth; 15.12.2011