SQL - Фильтр вычисляемого столбца с вычисляемым столбцом - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь найти наиболее дозированных пациентов в базе данных.Сумма доз должна быть рассчитана, а затем я должен динамически перечислить пациентов, которые получили столько доз.Запрос должен быть динамическим, и в списке может быть более 5 пациентов. Например, 5 самых больших доз составляют 7,6,5,4,3 дозы, но 3 человека получили 5 доз, поэтому мне придетсяперечислите в общей сложности 7 человек (пациенты, получающие 7,6,5,5,5,4,3 дозы).У меня проблемы, потому что вы не можете ссылаться на именованный столбец в предложении where, и я не знаю, как это исправить.

Запрос выглядит так:

SELECT 
    info.NAME, SUM(therapy.DOSE) AS total
FROM 
    dbo.PATIENT_INFORMATION_TBL info
JOIN 
    dbo.PATIENT_THERAPY_TBL therapy ON info.HOSPITAL_NUMBER = therapy.HOSPITAL_NUMBER
LEFT JOIN 
    dbo.FORMULARY_CLINICAL clinical ON clinical.ITEMID = therapy.ITEMID
WHERE 
    total IN (SELECT DISTINCT TOP 5 SUM(t.DOSE) AS 'DOSES'
              FROM dbo.PATIENT_INFORMATION_TBL i
              JOIN dbo.PATIENT_THERAPY_TBL t ON i.HOSPITAL_NUMBER = t.HOSPITAL_NUMBER
              LEFT JOIN dbo.FORMULARY_CLINICAL c ON c.ITEMID = t.ITEMID
              GROUP BY NAME
              ORDER BY 'DOSES' DESC) 
GROUP BY 
    info.NAME
ORDER BY 
    total DESC

База данных выглядит так:

enter image description here

Основнойвопрос: как я могу использовать предложение where / Имея, где мне нужно сравнить вычисляемый столбец со списком динамически вычисляемых значений?

Я использую Microsoft SQL Server 2012. DISTINCT в подзапросенеобходимо, чтобы появлялись только первые 5 дозировок (например, без DISTINCT Я получаю 7,6,5,4,3 с DISTINCT Я получаю 7,6,6,5,4, и моя цель - первая).

1 Ответ

0 голосов
/ 25 июня 2018

Большинство СУБД поддерживают стандартные SQL Аналитические функции подобно DENSE_RANK:

with cte as 
 (
    SELECT info.NAME, SUM(therapy.DOSE) as total,
       DENSE_RANK() OVER (ORDER BY SUM(therapy.DOSE) DESC) AS dr
    FROM dbo.PATIENT_INFORMATION_TBL info
    JOIN dbo.PATIENT_THERAPY_TBL therapy ON info.HOSPITAL_NUMBER=therapy.HOSPITAL_NUMBER
    LEFT JOIN dbo.FORMULARY_CLINICAL clinical ON clinical.ITEMID=therapy.ITEMID
    GROUP BY info.NAME
 ) 
select * 
from cte
where dr <= 5  -- only the five highest doses
ORDER BY total desc

Кстати, вам, вероятно, не нужно LEFT JOIN, поскольку вы не выбираете ни один столбец изdbo.FORMULARY_CLINICAL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...