首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每天的PostgreSQL总量,以周为单位

每天的PostgreSQL总量,以周为单位
EN

Stack Overflow用户
提问于 2012-10-07 08:48:06
回答 1查看 362关注 0票数 2

我一整天都在努力寻找这个挑战的解决方案。

我有一张桌子:

代码语言:javascript
运行
复制
  id   | amount  | type |            date            |              description              | club_id 
-------+---------+------+----------------------------+---------------------------------------+---------+--------
   783 |   10000 |    5 | 2011-08-23 12:52:19.995249 | Sign on fee                           |       7 

该表包含的数据比这个多得多。

我想要做的是在给定特定的club_id的情况下,获得每周的金额总和。

我最后得到的最后一件事是这样的,但它不起作用:

代码语言:javascript
运行
复制
WITH RECURSIVE t AS (
    SELECT EXTRACT(WEEK FROM date) AS week, amount FROM club_expenses WHERE club_id = 20 AND EXTRACT(WEEK FROM date) < 10 ORDER BY week 
    UNION ALL 
    SELECT week+1, amount FROM t WHERE week < 3
)
SELECT week, amount FROM t;

我不知道为什么它不能工作,但它抱怨工会。

我马上就要上床睡觉了,所以在明天之前我看不到任何答案(对不起)。

我希望我已经充分地描述了它。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-07 09:34:50

在我看来,您正在尝试使用UNION ALL来检索查询的第一部分的子集。那行不通的。您有两个选择。第一种方法是使用用户定义的函数在需要时添加行为,第二种方法是嵌套WITH子句。我倾向于前者,但你可能更喜欢后者。

要实现函数/表方法方法,您需要创建一个函数,该函数接受表中的一行作为输入,并且不直接命中该表。这提供了一系列的好处,包括能够轻松地为输出建立索引。这里的函数看起来像这样:

代码语言:javascript
运行
复制
CREATE FUNCTION week(club_expense) RETURNS int LANGUAGE SQL IMMUTABLE AS $$
    select EXTRACT(WEEK FROM $1.date)
$$;

现在,您有了一个可用的宏,可以在需要使用列的地方使用它。然后,您可以:

代码语言:javascript
运行
复制
SELECT c.week, sum(amount) FROM club_expense c
 GROUP BY c.week;

请注意,c之前的周不是可选的。解析器将其转换为week(c)。如果您想将其限制为一年,您可以对年份执行相同的操作。

这是Postgres的一个非常整洁、有用的特性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12765154

复制
相关文章

相似问题

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