Как исправить «должно быть совокупным выражением или появляться в предложении GROUP BY» с предложением «as» в Presto?

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

Образцы (поддельные) данные

я бы Пол кг 4f5a07ca-02e0-8981-3c30-4d9924a169a3 мужчина 103 4f5a07ca-02e0-8981-3c30-4d9924a169a3 мужчина 85 4f5a07ca-02e0-8981-3c30-4d9924a169a3 мужчина 469 e05d54e9-8292-b26c-5618-8a3712b4fc44 самка 33

Желаемый результат

я бы Пол кг 4f5a07ca-02e0-8981-3c30-4d9924a169a3 мужчина 85 e05d54e9-8292-b26c-5618-8a3712b4fc44 самка 33 e05d54e9-8292-b26c-5618-8a3712b4fc44 самка 36 01f8bbfd-cfc6-3b97-8bc1-8da6f0b4a9a8 самка 92

(Цель состоит в том, чтобы один и тот же идентификатор отображался только один раз и просто выбирал первое совпадение с учетом порядка 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.

Как я могу это решить?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
145
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать агрегатную функцию, чтобы получить 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

Вы проверили, что это работает в Presto? Потому что коррелированные подзапросы там весьма ограничены.

Guru Stron 17.11.2022 20:24

здесь вам нужна оконная функция 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

Спасибо! Однако похоже, что если я разделю по полу, я получу только две строки результатов: один результат для женщин и один результат для мужчин. Разве мне не нужно было бы разбивать по идентификатору, если бы я хотел только одно измерение веса для каждого пациента? Я обновил таблицу «Желаемый результат», чтобы сделать эту цель более ясной.

Yann Stoneman 21.11.2022 21:07

@YannStoneman, да, если бы вам нужна была 1 строка для каждого отдельного идентификатора, вы бы вместо этого разделили по идентификатору. это то, что вы хотели. извините, мое предыдущее прочтение вашего вопроса привело к мысли, что вам нужна отдельная запись для каждого пола. см. обновленный ответ.

Haleemur Ali 21.11.2022 23:16
Ответ принят как подходящий

«Заказ по кг» в сочетании с выбором только одного значения ужасно похож на агрегатную функцию min/max. В этом случае min (для пола можно использовать min_by или произвольно):

SELECT 
    p.id,
    min_by(p.gender, p.kg),
    min(p.kg)
FROM patient p
GROUP BY p.id

Другие вопросы по теме