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(即 db 不可知论)。但是,由于我正在开发 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询问SUM每个不同的权重user_id(作为 的结果GROUP BY user_id)。

于 2012-07-17T21:34:23.127 回答