postgresql의 월별 및 연도별 쿼리 결과 그룹화
Postgres 서버에 다음 데이터베이스 테이블이 있습니다.
id date Product Sales
1245 01/04/2013 Toys 1000
1245 01/04/2013 Toys 2000
1231 01/02/2013 Bicycle 50000
456461 01/01/2014 Bananas 4546
다음을 제공하는 쿼리를 만들고 싶습니다.SUM
의Sales
다음과 같이 결과를 월별 및 연도별로 그룹화합니다.
Apr 2013 3000 Toys
Feb 2013 50000 Bicycle
Jan 2014 4546 Bananas
그렇게 하는 간단한 방법이 있습니까?
저는 받아들여진 대답이 그렇게 많은 찬성표를 가지고 있다는 것을 믿을 수 없습니다. 그것은 끔찍한 방법입니다.
date_trun을 사용하는 올바른 방법은 다음과 같습니다.
SELECT date_trunc('month', txn_date) AS txn_month, sum(amount) as monthly_sum
FROM yourtable
GROUP BY txn_month
나쁜 관행이지만 사용하면 용서받을 수도 있습니다.
GROUP BY 1
아주 간단한 질문으로.
사용할 수도 있습니다.
GROUP BY date_trunc('month', txn_date)
날짜를 선택하지 않으려는 경우
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의 "추출" 함수는 "날짜" 속성에서 YYYY년을 추출하는 데 사용됩니다.
sum("Sales") as "Sales"
SUM() 기능은 모든 "판매" 값을 합산하고 대소문자를 구분하는 별칭을 제공하며, 대소문자 구분은 이중 따옴표를 사용하여 유지됩니다.
group by 1,2
GROUP BY 함수는 SELECT 목록에서 집계의 일부가 아닌 모든 열(SUM/AVG/MIN/MAX 함수 내에 없는 모든 열 등)을 포함해야 합니다.이는 쿼리에 각 열의 고유한 조합(이 경우 월 및 연도 열)에 SUM()을 적용해야 한다는 것을 나타냅니다."1,2" 부분은 열 별칭을 사용하는 대신 단축형이지만, 가독성을 위해 전체 "to_char(...)" 및 "extract(...)" 표현을 사용하는 것이 가장 좋습니다.
to_char
실제로 한 번에 한 해와 한 달을 끄집어낼 수 있습니다!
select to_char(date('2014-05-10'),'Mon-YY') as year_month; --'May-14'
select to_char(date('2014-05-10'),'YYYY-MM') as year_month; --'2014-05'
또는 위의 사용자 예제의 경우:
select to_char(date,'YY-Mon') as year_month
sum("Sales") as "Sales"
from some_table
group by 1;
그냥 사용하는 게 어때요?date_part
기능.https://www.postgresql.org/docs/8.0/functions-datetime.html
SELECT date_part('year', txn_date) AS txn_year,
date_part('month', txn_date) AS txn_month,
sum(amount) as monthly_sum
FROM payment
GROUP BY txn_year, txn_month
order by txn_year;
postgres에서 date_part() 함수를 사용하여 결과를 얻는 다른 방법이 있습니다.
SELECT date_part('month', txn_date) AS txn_month, date_part('year', txn_date) AS txn_year, sum(amount) as monthly_sum
FROM yourtable
GROUP BY date_part('month', txn_date)
감사해요.
이 튜토리얼의 예 6)을 보십시오. -> https://www.postgresqltutorial.com/postgresql-group-by/
선택 시 생성한 가상 속성의 이름을 호출하는 대신 GROUP BY에서 함수를 호출해야 합니다.저는 위의 모든 답변이 추천하는 것을 하고 있었고, 저는 그것을 받았습니다.column 'year_month' does not exist
오류
저에게 효과가 있었던 것은 다음과 같습니다.
SELECT
date_trunc('month', created_at), 'MM/YYYY' AS month
FROM
"orders"
GROUP BY
date_trunc('month', created_at)
Postgres에는 몇 가지 유형의 타임스탬프가 있습니다.
시간대가 없는 타임스탬프 - (UTC 타임스탬프를 저장하는 것이 좋습니다) 다국적 데이터베이스 저장소에서 찾을 수 있습니다.이 경우 고객이 각 국가의 표준 시간대 오프셋을 처리합니다.
timezone이 있는 timestamp - 시간대 오프셋이 이미 타임스탬프에 포함되어 있습니다.
데이터베이스가 표준 시간대를 사용하지 않는 경우도 있지만 로컬 표준 시간대 및 일광 절약 시간(예: https://www.timeanddate.com/time/zone/romania/bucharest) )과 관련하여 레코드를 그룹화해야 합니다.
표준 시간대를 추가하려면 이 예제를 사용하고 표준 시간대 오프셋을 사용자의 것으로 바꿀 수 있습니다.
"your_date_column" at time zone '+03'
DST와 관련된 +1 여름 시간 오프셋을 추가하려면 타임스탬프가 여름 DST에 해당하는지 확인해야 합니다.이러한 간격은 1일 또는 2일에 따라 다르므로 월말 기록에 영향을 미치지 않는 근사치를 사용하여 이 경우 매년 정확한 간격을 무시할 수 있습니다.
더 정확한 쿼리를 작성해야 하는 경우에는 조건을 추가하여 더 많은 사례를 만들어야 합니다.그러나 데이터베이스에서 표준 시간대가 없는 타임스탬프를 찾을 때 표준 시간대 및 SummerTime과 관련하여 매월 데이터를 분할하는 경우에는 이 작업이 잘 수행됩니다.
SELECT
"id", "Product", "Sale",
date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END) as "date"
FROM
public."Table" AS t
WHERE 1=1
AND t."date" >= '01/07/2015 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
AND t."date" < '01/07/2017 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
GROUP BY date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END)
저는 또한 년과 월별로 그룹화된 결과를 찾아야 합니다.제가 타임스탬프별로 그룹화했을 때, 합계 함수는 날짜와 분으로 그룹화했지만, 제가 원하는 것은 아니었습니다.이 쿼리를 사용하면 도움이 될 수 있습니다.
select sum(sum),
concat(year, '-', month, '-', '01')::timestamp
from (select sum(t.final_price) as sum,
extract(year from t.created_at) as year,
extract(month from t.created_at) as month
from transactions t
where status = 'SUCCESS'
group by t.created_at) t
group by year, month;
transactions table query result 사진에서 볼 수 있듯이 '2022-07-01'에서 나는 테이블에 두 개의 열을 가지고 있고, 쿼리 결과에서 그것들은 함께 그룹화되어 있습니다.
언급URL : https://stackoverflow.com/questions/17492167/group-query-results-by-month-and-year-in-postgresql
'programing' 카테고리의 다른 글
왜 제가 "git push --setupstream origin"을 해야 합니까? (0) | 2023.05.22 |
---|---|
SQL 모범 사례 없음 (0) | 2023.05.22 |
Node.js의 ECONNRESET 오류를 디버깅하려면 어떻게 해야 합니까? (0) | 2023.05.17 |
Windows에서 사용자 지정 URL 프로토콜을 등록하려면 어떻게 해야 합니까? (0) | 2023.05.17 |
운영 모드를 활성화하는 방법은 무엇입니까? (0) | 2023.05.17 |