SQL: эффективная классификация нескольких полей одного типа - PullRequest
0 голосов
/ 30 апреля 2019

Допустим, у меня есть таблица данных «посещения», которая содержит четыре столбца: идентификатор пациента и три закодированных медицинских диагноза.Каждый ряд представляет визит к врачу.Что-то вроде

PATIENTID  DIAGNOSIS1  DIAGNOSIS2  DIAGNOSIS3
0001             0234        0020          NA
0002             9383          NA          NA
0003             5983        8372        7747
0004             1143          NA          NA

У меня также есть таблица 'class', которая классифицирует болезни по трем категориям:

DIAGNOSIS  CLASS
     0234      1
     0020      3
     9383      2
     5983      2
     8372      1
     7747      1
     1143      3

Я хотел бы закончить с таблицей, которая дает классификацию каждогодиагностика;что-то вроде

PATIENTID  DIAGNOSIS1  DIAGNOSIS2  DIAGNOSIS3  CLASS1  CLASS2  CLASS3
0001             0234        0020          NA       1       3      NA
0002             9383          NA          NA       2      NA      NA
0003             5983        8372        7747       2       1       1
0004             1143          NA          NA       3      NA      NA

Какой самый эффективный способ сделать это?Мое первое предположение состоит в том, чтобы повторно соединять «посещения» и «класс» в следующем порядке:

SELECT
    v3.DIAGNOSIS1,
    v3.DIAGNOSIS2,
    v3.DIAGNOSIS3,
    v3.CLASS1,
    v3.CLASS2,
    c3.CLASS AS CLASS3
FROM
    (
    SELECT
        v2.DIAGNOSIS1,
        v2.DIAGNOSIS2, 
        v2.DIAGNOSIS3,
        v2.CLASS1
        c2.CLASS AS CLASS2
    FROM
        (
        SELECT 
            v1.DIAGNOSIS1,
            v1.DIAGNOSIS2,
            v1.DIAGNOSIS3,
            c1.CLASS AS CLASS1
        FROM visit AS v1
        LEFT JOIN class AS c1
        ON (v1.DIAGNOSIS1=c1.DIAGNOSIS)
        )
    AS v2 
    LEFT JOIN class AS c2
    ON (v2.DIAGNOSIS2=c2.DIAGNOSIS)
    )
AS v3 
LEFT JOIN class AS c3
ON (v3.DIAGNOSIS3=c3.DIAGNOSIS)

Но это грязно (особенно с ростом числа столбцов «диагноза») и, вероятно, довольно медленно.Есть ли способ лучше?

1 Ответ

1 голос
/ 30 апреля 2019

Вы должны присоединиться к таблице class 3 раза до visit, по одному разу для каждого из столбцов diagnosis1, diagnosis2 и diagnosis3:

select
  v.*,
  c1.class class1,
  c2.class class2,
  c3.class class3
from visit v 
left join class c1 on c1.diagnosis = v.diagnosis1
left join class c2 on c2.diagnosis = v.diagnosis2
left join class c3 on c3.diagnosis = v.diagnosis3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...