programing

postgresql의 월별 및 연도별 쿼리 결과 그룹화

instargram 2023. 5. 17. 22:28
반응형

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

다음을 제공하는 쿼리를 만들고 싶습니다.SUMSales다음과 같이 결과를 월별 및 연도별로 그룹화합니다.

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 yyyyPostgresql의 "추출" 함수는 "날짜" 속성에서 YYYY년을 추출하는 데 사용됩니다.

sum("Sales") as "Sales"SUM() 기능은 모든 "판매" 값을 합산하고 대소문자를 구분하는 별칭을 제공하며, 대소문자 구분은 이중 따옴표를 사용하여 유지됩니다.

group by 1,2GROUP 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

반응형