2

我有一个大的:

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

这是一张包含大约 500 家医院一年内的医疗手术记录的表格。大约有 3 亿行。

我的问题是:

对于每家 X 医院,有多少婴儿在同一家医院出生后立即(同一天)接受了重症监护?

例如,在 A 医院,100 名婴儿出生,其中 20 名婴儿在同一天在同一家医院被送往重症监护室。

P619920 是出生的操作ID。记录母亲的身份信息是为了出生,而不是婴儿。

I552015 是重症监护的手术 ID。记录婴儿的身份证信息。

首先,我通过以下方式隔离医院 A:

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

医院_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|

我试图匹配:

a) 婴儿和母亲的姓氏

b) 操作日期。

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 行。

但是,当我对 BIGTABLE 应用相同的查询时,医院 A 有 81 行。

我理解这种差异源于在其他医院出生但在同一天被送往医院 A 接受重症监护的婴儿。

在 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 表不同,因为它包含医院 B。

我对 BIGTABLE 的查询应该提取在同一家医院发生的同一天出生的重症监护组合。

结果表:

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

3 回答 3

3

只需附加两行必须来自同一家医院的条件:

and t.hospital = v.hospital

顺便说一句,您的陈述中又缺少一个条件。您正在检查母亲的 OP 日期是否与婴儿的出生日期相同。您正在使用它来匹配婴儿和母亲。但是您忘记检查婴儿的 OP 日期是否与出生日期相同。只有在出生当天被送往重症监护室的婴儿才需要这种条件。


要回答您评论中的问题:

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
;
于 2011-12-15T11:29:07.003 回答
1
SELECT name, surname, hospital, op_date
  FROM BIGTABLE
 WHERE op_id = 'P619920'
INTERSECT
SELECT name, surname, hospital, op_date
  FROM BIGTABLE
 WHERE op_id = 'I552015';
于 2011-12-15T12:09:26.130 回答
-1

除了医院,加入姓名和姓氏,或者更好的是,如果你有个人身份证,则加入。有了这么多行,几乎可以保证有相同姓名和姓氏的人。

于 2011-12-15T11:33:02.253 回答