首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres generate_series

Postgres generate_series
EN

Stack Overflow用户
提问于 2011-08-21 17:19:48
回答 2查看 10K关注 0票数 4

我想要的是对一个表进行统计,为此我使用了generate_series();

下面是我正在做的事情:

代码语言:javascript
复制
SELECT x.month, amount
FROM (SELECT generate_series(
                 min(date_trunc('month', date)),
                 max(date_trunc('month', date)),
                 '1 month'
      ) AS month
      FROM table
      WHERE user_id = 55 AND ...
) x
LEFT JOIN (
      SELECT SUM(amount) AS amount, date_trunc('month', date) AS month
      FROM table
      WHERE user_id = 55 AND ...
      GROUP BY month
) q ON q.month = x.month
ORDER BY month

这很有效,但当我想要应用过滤器时,比如获取特定用户的数量,我必须应用它们两次。有没有一种方法可以避免过滤两次,或者用一种更有效的方式重写,因为我不确定这是否是正确的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-21 18:17:49

您可以为此编写WITH query

代码语言:javascript
复制
WITH month_amount AS
(
    SELECT
        sum(amount) AS amount,
        date_trunc('month', date) AS month
    FROM Amount
    WHERE user_id = 55 -- AND ...
    GROUP BY month
)
SELECT month, amount
FROM
    (SELECT generate_series(min(month), max(month), '1 month') AS month
    FROM month_amount) x
LEFT JOIN month_amount
USING (month)
ORDER BY month;

示例结果:

代码语言:javascript
复制
SELECT * FROM amount WHERE user_id = 55;
 amount_id | user_id | amount |    date    
-----------+---------+--------+------------
         3 |      55 |      7 | 2011-03-16
         4 |      55 |      5 | 2011-03-22
         5 |      55 |      2 | 2011-05-07
         6 |      55 |     18 | 2011-05-27
         7 |      55 |      4 | 2011-06-14
(5 rows)

WITH month_amount ..
         month          | amount 
------------------------+--------
 2011-03-01 00:00:00+01 |     12
 2011-04-01 00:00:00+02 |       
 2011-05-01 00:00:00+02 |     20
 2011-06-01 00:00:00+02 |      4
(4 rows)
票数 9
EN

Stack Overflow用户

发布于 2011-08-21 18:18:49

您可以在WITH子句中执行查询,然后使用SELECT添加缺少的月份:

代码语言:javascript
复制
WITH query AS (
      SELECT SUM(amount) AS amount, date_trunc('month', date) AS month
      FROM table
      WHERE user_id = 55 AND ...
      GROUP BY month
)
SELECT date(d.month) AS month, q.amount
FROM (
    SELECT generate_series(min(month), max(month), '1 month') AS month
    FROM query
    ) d
    LEFT JOIN query q ON q.month = d.month
ORDER BY month
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7137406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档