Группировка по выражению SQL - PullRequest
4 голосов
/ 28 февраля 2010

Итак, я получил это утверждение, которое отлично работает:

SELECT   MAX(patient_history_date_bio) AS med_date, medication_name
FROM     biological
WHERE    patient_id = 12)
GROUP BY medication_name

Но я бы тоже хотел получить соответствующую дозу лекарства. Поэтому я набираю это

SELECT   MAX(patient_history_date_bio) AS med_date, medication_name, medication_dose
FROM     biological
WHERE    (patient_id = 12)
GROUP BY medication_name

Но это дает мне ошибку, говорящую:

"coumn'ological.medication_dose 'недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY."

Поэтому я пытаюсь добавить medication_dose к предложению GROUP BY, но тогда это дает мне дополнительные строки, которые мне не нужны. Я хотел бы получить последнюю строку для каждого лекарства в моей таблице. (Последняя строка определяется функцией max, получая самую последнюю дату).

Как мне решить эту проблему?

Ответы [ 3 ]

5 голосов
/ 28 февраля 2010

Использование:

SELECT b.medication_name,
       b.patient_history_date_bio AS med_date,
       b.medication_dose
  FROM BIOLOGICAL b
  JOIN (SELECT y.medication_name,
               MAX(y.patient_history_date_bio) AS max_date
          FROM BIOLOGICAL y
      GROUP BY y.medication_name) x ON x.medication_name = b.medication_name
                                   AND x.max_date = b.patient_history_date_bio
 WHERE b.patient_id = ?
1 голос
/ 28 февраля 2010

Если вам действительно нужно, в качестве одного быстрого обходного пути, вы можете применить агрегатную функцию к вашему medication_dose, например MAX(medication_dose).

Однако учтите, что обычно это указание на то, что выневерный запрос, или что вам нужно реорганизовать / нормализовать схему базы данных.В вашем случае, похоже, вы неправильно выполняете запрос.Правильный подход, предложенный OMG Poinies в другом ответе .

Возможно, вас заинтересует следующая интересная статья, в которой описаны причины этой ошибки:

0 голосов
/ 28 февраля 2010

Вы должны поставить max(medication_dose) на ваш выбор. Group by возвращает набор результатов, который содержит различные значения для полей в вашей группе по выражению, поэтому очевидно, что у вас есть несколько записей, которые имеют одинаковые medication_name, но разные дозы, поэтому вы получаете два результата.

При вводе max(medication_dose) будет возвращено максимальное значение дозы для каждого medication_name. Вы можете использовать любую агрегатную функцию по дозе (max, min, avg, sum и т. Д.)

...