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;

なぜ動作しないのかわかりませんが、UNIONALLについて文句を言います。

すぐに寝ますので、明日まで答えが見えません(ごめんなさい)。

私はそれを適切に説明したと思います。

前もって感謝します!

4

1 に答える 1

1

UNION ALL を使用して、クエリの最初の部分のサブセットを取得しようとしているように見えます。それはうまくいきません。2 つのオプションがあります。1 つ目は、ユーザー定義関数を使用して必要に応じて動作を追加することです。2 つ目は、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 に注意してください。before week はオプションではありません。パーサーはこれを week(c) に変換します。これを年に制限したい場合は、年でも同じことができます。

これは、Postgres の非常に優れた便利な機能です。

于 2012-10-07T01:34:49.980 に答える