2012-11-07 4 views
3

Я получаю сообщение об ошибке выполнения этого запросагруппы по дате агрегатной функции в PostgreSQL

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons" 
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07  12:25:04.082224') 
GROUP BY date(updated_at) 
ORDER BY persons.updated_at DESC 

Я получаю ошибку об ошибке: колонка «persons.updated_at» должна появиться в GROUP BY оговорки или использоваться в Агрегатная функция ЛИНИЯ 5: ORDER BY DESC persons.updated_at

Это работает, если удалить дату (функции из группы по вызову, однако я использую функцию даты, потому что я хочу, чтобы группа по дате, а не DateTime

любые идеи

ответ

7

На данный момент неясно, что вы хотите, чтобы Postgres вернулись. Вы говорите, что он должен заказать по persons.updated_at, но вы не извлекаете это поле из базы данных.

Я думаю, что вы хотите сделать, это:

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons" 
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07  12:25:04.082224') 
GROUP BY date(updated_at) 
ORDER BY count(updated_at) DESC -- this line changed! 

Теперь вы явно говорит DB для сортировки результирующего значения из COUNT-агрегата. Вы также можете использовать: ORDER BY 2 DESC, эффективно сообщая базе данных для сортировки по второй колонке в наборе результатов. Однако я настоятельно рекомендую явно указать колонку для ясности.

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

3

проблема заключается в том, что, поскольку вы группирование по date(updated_at), значение updated_at не может быть уникальным, разные значения updated_at могут возвращать одинаковое значение для date(updated_at). Вы должны указать базу данных которые из возможных значений он должен использовать, или попеременно использовать значение, возвращенное группе, вероятно, один из

SELECT date(updated_at) FROM persons GROUP BY date(updated_at) 
ORDER BY date(updated_at) 

или

SELECT date(updated_at) FROM persons GROUP BY date(updated_at) 
ORDER BY min(updated_at) 
+0

'мин()' в 'ORDER BY' спас мой день! – sequielo

Смежные вопросы