sql подзапрос присоединиться к группе - PullRequest
0 голосов
/ 15 октября 2018

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

medical_school_id хранится в таблице doctor_record graduation_dt также хранится в таблице doctor_record.

Мне удалось выписать этот запрос с помощью подзапроса, который выполняетоператор выбора, подсчитывающий количество других для каждой строки, но это занимает вечность.Моя логика подсказывает мне, что сначала мне нужно выполнить простой запрос GROUP BY, а затем как-нибудь присоединиться к нему medical_school_id.

Группировка по запросу выглядит следующим образом

select count(ca.id) , cdr.medical_school_id, cdr.graduation_dt
from account ca
LEFT JOIN doctor cd on ca.id = cd.account_id
LEFT JOIN doctor_record cdr on cd.gmc_number = cdr.gmc_number
GROUP BY cdr.medical_school_id, cdr.graduation_dt

длинный запрос на выборку

select a.id, a.email , dr.medical_school_id,
                     (select count(ba.id) from account ba
                    LEFT JOIN doctor bd on ba.id = bd.account_id
                    LEFT JOIN doctor_record bdr on bd.gmc_number = bdr.gmc_number
                    WHERE bdr.medical_school_id = dr.medical_school_id AND bdr.graduation_dt = dr.graduation_dt) AS med_count,


from account a
LEFT JOIN doctor d on a.id = d.account_id
LEFT JOIN doctor_record dr on d.gmc_number = dr.gmc_number

Если бы вы могли подтолкнуть меня в правильном направлении, это было бы удивительно

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Используя тот же код для группы:

SELECT * FROM (
(

SELECT   acc.[id]
       , acc.[email]
FROM  
   account acc
LEFT JOIN 
   doctor doc 
ON 
   acc.id = doc.account_id
LEFT JOIN 
   doctor_record doc_rec 
ON 
   doc.gmc_number = doc_rec.gmc_number

) label

LEFT JOIN 
(

SELECT  count(acco.id) 
      , doc_reco.medical_school_id
      , doc_reco.graduation_dt
FROM 
   account acco
LEFT JOIN 
   doctor doct 
ON 
   acco.id = doct.account_id
LEFT JOIN 
   doctor_record doc_reco 
ON 
   doct.gmc_number = doc_reco.gmc_number
GROUP BY 
   doc_reco.medical_school_id, 
   doc_reco.graduation_dt

) count

ON 
count.[medical_school_id]=label.[medical_school_id]
AND
count.[graduation_dt]=label.[graduation_date]

)
0 голосов
/ 15 октября 2018

как насчет этого?

select a.doctor_id
, count(*) - 1 
from doctor_record a
left join doctor_record b on a.medical_school_id = b.medical_school_id
                         and a.graduation_dt = b.graduation_dt
group by a.doctor_id
  1. Вычтите 1 из подсчета, чтобы вы не считали доктора в числе "другие люди в той же группе"

  2. Я определяю «ту же группу» как «та же медицинская школа и дата окончания».

  3. Мне неясно, что такое номер GMC и как он связан.Это как-то связано с когортой?

0 голосов
/ 15 октября 2018

Я думаю, вы просто хотите, чтобы оконные функции:

select a.id, a.email, dr.medical_school_id, dr.graduation_dt,
       count(*) over (partition by dr.medical_school_id, dr.graduation_dt) as cohort_size
from account a left join
     doctor d
     on a.id = d.account_id left join
     doctor_record dr
     on d.gmc_number = dr.gmc_number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...