2

私はビッグテーブルを持っています:

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

年間約500病院の診療実績をまとめた表です。約 3 億行あります。

私の質問は:

X 病院ごとに、同じ病院で何人の赤ちゃんが生まれ、そのうち何人が生後すぐに (同じ日に) 集中治療を受けましたか?

たとえば、病院 A では、100 人の赤ちゃんが生まれ、そのうちの 20 人が同じ病院で同じ日に集中治療室に運ばれました。

P619920 は、誕生の操作 ID です。母親のID情報は、赤ちゃんではなく出生時に記録されます。

I552015 は、集中治療の操作 ID です。赤ちゃんのID情報が記録されます。

まず、次の方法で病院 A を隔離しました。

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|

私は一致しようとしました:

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 の結果は、病院 B が含まれているため、分離された Hospital_A テーブルとは異なります。

BIGTABLE に対する私のクエリは、同じ病院で発生した同日出産と集中治療の組み合わせを抽出する必要があります。

結果のテーブル:

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

3 に答える 3

3

両方の行が同じ病院のものでなければならないという条件を追加するだけです。

and t.hospital = v.hospital

ところで、ステートメントにもう 1 つの条件がありません。母親の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

病院に加えて、姓に加えて名前に参加するか、さらに良いことに、持っている場合は個人IDに参加します. これだけ行があれば、同姓同名の人物がほぼ確実に存在します。

于 2011-12-15T11:33:02.253 に答える