Этот вопрос похож на другой , но я привожу более простой пример. другой запрос был слишком сложным, чтобы иметь для меня смысл.
(Цель состоит в том, чтобы один и тот же идентификатор отображался только один раз и просто выбирал первое совпадение с учетом порядка kg
)
ЗАПРОС:
SELECT
p.id,
p.gender,
p.kg
FROM patient p
ORDER BY p.kg
GROUP BY 1
Ошибка:
«p.gender» должен быть совокупным выражением или появляться в предложении GROUP BY.
И если я изменю его на GROUP BY 1, 2
, я получу ту же ошибку, на один столбец больше:
'p.kg' должен быть агрегированным выражением или появляться в предложении GROUP BY.
Как я могу это решить?
Вы можете использовать агрегатную функцию, чтобы получить min/max/avg кг. В противном случае вам нужно заменить p.kg подзапросом, возвращающим одну версию, например:
SELECT
p.id,
p.gender,
(select top 1 p.kg from patient where patient.id=p.id)
FROM patient p
ORDER BY p.id
здесь вам нужна оконная функция first_value в сочетании с отличным, а не групповым/агрегированным.
оконная функция + отдельный шаблон иногда могут использоваться для репликации агрегированного запроса
select distinct
id
, first_value(gender) over (partition by id order by kg) gender
, first_value(kg) over (partition by id order by kg) kg
from patient
Спасибо! Однако похоже, что если я разделю по полу, я получу только две строки результатов: один результат для женщин и один результат для мужчин. Разве мне не нужно было бы разбивать по идентификатору, если бы я хотел только одно измерение веса для каждого пациента? Я обновил таблицу «Желаемый результат», чтобы сделать эту цель более ясной.
@YannStoneman, да, если бы вам нужна была 1 строка для каждого отдельного идентификатора, вы бы вместо этого разделили по идентификатору. это то, что вы хотели. извините, мое предыдущее прочтение вашего вопроса привело к мысли, что вам нужна отдельная запись для каждого пола. см. обновленный ответ.
«Заказ по кг» в сочетании с выбором только одного значения ужасно похож на агрегатную функцию min
/max
. В этом случае min
(для пола можно использовать min_by или произвольно):
SELECT
p.id,
min_by(p.gender, p.kg),
min(p.kg)
FROM patient p
GROUP BY p.id
Вы проверили, что это работает в Presto? Потому что коррелированные подзапросы там весьма ограничены.