我一直在努力寻找解决这一挑战的方法。
我有一张桌子:
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。
我将在一分钟后上床睡觉,所以明天之前我将无法看到任何答案(对不起)。
我希望我已经充分描述了它。
提前致谢!
答案 0 :(得分: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的一个非常简洁实用的功能。