2

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

我有一张桌子:

  id   | amount  | type |            date            |              description              | club_id 
-------+---------+------+----------------------------+---------------------------------------+---------+--------
   783 |   10000 |    5 | 2011-08-23 12:52:19.995249 | Sign on fee                           |       7 

该表的数据比这多得多。

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

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

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;

我不确定为什么它不起作用,但它抱怨 UNION ALL。

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

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

提前致谢!

4

1 回答 1

1

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

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

CREATE FUNCTION week(club_expense) RETURNS int LANGUAGE SQL IMMUTABLE AS $$
    select EXTRACT(WEEK FROM $1.date)
$$;

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

SELECT c.week, sum(amount) FROM club_expense c
 GROUP BY c.week;

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

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

于 2012-10-07T01:34:49.980 回答