select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
По просьбе Раду я объясню этот запрос:
to_char(date,'Mon') as mon,
: преобразует атрибут «дата» в определенный формат краткой формы месяца.
extract(year from date) as yyyy
Функция Postgresql «extract» используется для извлечения года YYYY из атрибута «date».
sum("Sales") as "Sales"
: Функция SUM () суммирует все значения «Sales» и предоставляет псевдоним с учетом регистра, причем чувствительность к регистру поддерживается с помощью двойных кавычек.
group by 1,2
: Функция GROUP BY должна содержать все столбцы из списка SELECT, которые не являются частью агрегата (то есть все столбцы, не входящие в функции SUM / AVG / MIN / MAX и т. Д.). Это говорит запросу, что SUM () должен применяться для каждой уникальной комбинации столбцов, которые в этом случае являются столбцами месяца и года. Часть "1,2" является сокращением вместо использования псевдонимов столбцов, хотя, вероятно, лучше всего использовать полные выражения "to_char (...)" и "extract (...)" для удобства чтения.
date_trunc
не совсем то, что хотелselect date_trunc('month', timestamp '2001-02-16 20:38:40')::date
2001-02-01
date_trunc
вgroup by
предложении.Я не могу поверить, что принятый ответ имеет так много откликов - это ужасный метод.
Вот правильный способ сделать это с помощью date_trunc :
Это плохая практика, но вы можете быть прощены, если вы используете
в очень простом запросе.
Вы также можете использовать
если вы не хотите выбирать дату.
источник
date_trunc
не соответствует ожиданиям автора:select date_trunc('month', timestamp '2001-02-16 20:38:40')
=>2001-02-01 00:00:00
.to_char(date_trunc('month', txn_date), 'YY-Mon')
date_trunc
был создан именно для этой цели. нет причин создавать две колонкиto_char
на самом деле позволяет вытащить год и месяц одним махом!или в случае примера пользователя выше:
источник
date_trunc
метод при выполнении группы по. Экспериментируя с БД, которая у меня есть, на таблице с 270k строк, метод date_trunc более чем в два раза превышает скорость TO_CHARЕсть еще один способ добиться результата, используя функцию date_part () в postgres.
Спасибо
источник
Ответ BMA отличный! Я использовал это с ActiveRecords, вот, если кому-то это нужно в Rails:
источник
yourscopeorclass.group("extract(year from tablename.colname)")
и вы можете связать это вместе 3 раза, чтобы получить год, месяц, деньПосмотрите на пример E этого урока -> https://www.postgresqltutorial.com/postgresql-group-by/
Вам нужно вызвать функцию в вашем GROUP BY, а не вызывать имя виртуального атрибута, который вы создали при выборе. Я делал то, что рекомендовали все ответы выше, и я получал
column 'year_month' does not exist
ошибку.Что сработало для меня:
источник
Postgres имеет несколько типов временных меток:
временная метка без часового пояса - (предпочтительно для хранения временных меток UTC) Вы найдете ее в хранилище многонациональной базы данных. В этом случае клиент позаботится о смещении часового пояса для каждой страны.
метка времени с часовым поясом - смещение часового пояса уже включено в метку времени.
В некоторых случаях ваша база данных не использует часовой пояс, но вам все равно нужно сгруппировать записи по местному часовому поясу и летнему времени (например, https://www.timeanddate.com/time/zone/romania/bucharest )
Чтобы добавить часовой пояс, вы можете использовать этот пример и заменить смещение часового пояса своим.
Чтобы добавить +1 летнее время, специфичное для летнего времени, вам нужно проверить, попадает ли ваша метка времени в летнее летнее время. Поскольку эти интервалы варьируются в зависимости от 1 или 2 дней, я буду использовать примерное приближение, которое не влияет на записи на конец месяца, поэтому в этом случае я могу игнорировать точный интервал каждого года.
Если необходимо построить более точный запрос, вам нужно добавить условия для создания большего количества случаев. Но примерно, это будет хорошо работать при разделении данных за месяц относительно часового пояса и SummerTime, когда вы найдете временную метку без часового пояса в вашей базе данных:
источник