3

次のような SQL テーブルがあります。

CREATE TABLE diet_watch (
  entry_date date NOT NULL,
  user_id    int default 1,
  weight     double precision NOT NULL
);

INSERT INTO diet_watch VALUES ('2001-01-01', 1, 128.2);
INSERT INTO diet_watch VALUES ('2001-01-02', 1, 121.2);
INSERT INTO diet_watch VALUES ('2001-01-03', 1, 100.6);
INSERT INTO diet_watch VALUES ('2001-01-04', 1, 303.7);
INSERT INTO diet_watch VALUES ('2001-01-05', 1, 121.0);
INSERT INTO diet_watch VALUES ('2001-01-01', 2, 121.0);
INSERT INTO diet_watch VALUES ('2001-01-06', 2, 128.0);
INSERT INTO diet_watch VALUES ('2001-01-07', 2, 138.0);
INSERT INTO diet_watch VALUES ('2001-01-01', 3, 128.2);
INSERT INTO diet_watch VALUES ('2001-01-02', 3, 125.5);
INSERT INTO diet_watch VALUES ('2001-01-03', 3, 112.8);
INSERT INTO diet_watch VALUES ('2001-01-06', 3, 111.2);

私はさらにこのテーブルを持っています:

CREATE TABLE summing_period (
    user_id INT NOT NULL, 
    start_date DATE NOT NULL, 
    end_date DATE NOT NULL); 

insert into summing_period VALUES (1, '2001-01-01', '2001-01-03'); 
insert into summing_period VALUES (2, '2001-01-02', '2001-01-06'); 
insert into summing_period VALUES (3, '2001-01-03', '2001-01-06'); 

次の列で DISTINCT ROWS を返すクエリを作成したいと考えています。

  • user_id _
  • テーブル summing_period の指定された日付間のテーブルの重みの合計 (user_id の場合)diet_watch

したがって、テーブル集計期間のデータに基づくクエリの結果は次のようになります。

1,350.0
2,128.0
3,224.0

残念ながら、今回は SQLfu の限界に達してしまいました。SQL の作成を開始する方法さえわかりません。理想的には、ソリューションは ANSI SQL (つまり、データベースに依存しない) である必要があります。ただし、私は PostgreSQL 8.4 バックエンドを開発しているため、ソリューションが db 中心の場合、少なくとも PG で実行する必要があります。

4

1 に答える 1

4
SELECT
    sp.user_id, SUM(dw.weight)
FROM
    summing_period sp,
    diet_watch dw
WHERE
    dw.user_id = sp.user_id AND
    dw.entry_date >= sp.start_date AND
    dw.entry_date <= sp.end_date
GROUP BY
    sp.user_id

このクエリが行うことはdiet_watch、各行を の行に結合し、summing_periodそのuser_id日付がsumming_periodの範囲に収まります。

次に、はそれぞれの重みの をSELECT要求します( の結果として)。SUMuser_idGROUP BY user_id

于 2012-07-17T21:34:23.127 に答える