簡體   English   中英

使用Postgres匯總列值和按月分組日期

[英]Sum column value and group dates by month with Postgres

我的Postgres DB中有一個表,看起來像這樣:

date          duration
2018-05-10      10
2018-05-12      15
2018-06-01      10
2018-06-02      20
2019-01-01      5
2019-01-02      15
2019-04-01      10

我希望將每個月的值相加,然后按年,月和月的數字將它們分組為如下所示:

year    month    month_number   monthly_sum
2018    May         5              25
2018    June        6              30
2019    Jan         1              20
2019    Apr         4              10

並以如下查詢結束:

SELECT 
  to_char(date_trunc('month', date), 'YYYY') AS year,
  to_char(date_trunc('month', date), 'Mon') AS month,
  to_char(date_trunc('month', date), 'MM') AS month_number,
  sum(duration) AS monthly_sum
FROM timesheet 
GROUP BY year, month, month_number

而且效果很好,我的問題是:這個查詢被認為是不好的嗎? 如果有10萬行,它會影響性能嗎? 我聽說使用to_char不如date_trunc,這是我在這里要避免的方法,我只是將date_trunc包裝在to_char中。 另外,在GROUP BY子句中具有三個值,這會影響什么嗎?

使用功能並相應地使用功能進行分組可能會降低性能。 為此,最好使Calendar表具有適當的索引,這樣您就不必在每個表上都處理此類問題。

選中此此(日歷表)

該查詢還不錯,但是您可以簡化它。

SELECT to_char(date_trunc('month', date), 'YYYY') AS year,
       to_char(date_trunc('month', date), 'Mon') AS month,
       to_char(date_trunc('month', date), 'MM') AS month_number,
       sum(duration) AS monthly_sum
FROM timesheet 
GROUP BY date_trunc('month', date);

從性能的角度來看,較短的GROUP BY鍵對性能的影響很小,但是我不必擔心。

由於查詢沒有任何過濾條件,因此它將始終讀取表的所有行:這是對性能的主要影響。 如果您有過濾條件,則最好具有正確的索引。

話雖如此,您提取年份和月份的方式可能會有所改善,如此處的其他答案所示,但這對查詢性能幾乎沒有影響。

總之,在沒有過濾條件的情況下,您的查詢已接近最佳狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM