1

我需要创建这个表(不是真的用于甜甜圈)。

我基本上想输出在某个时间范围内销售产品的时间。

时间范围在表中定义,需要能够在不中断查询的情况下重新配置(删除和重新创建)。

也就是说,我们有兴趣监控的 time_frames 在设计上会经常变化。今天可能定义了 4 个时间框架(6 小时 ea),明天我可能只定义一个(24 小时),第二天可能有 12 行(2 ea)。time_frames 也可能具有不同的长度。列将保持不变。

SQLFiddle

CREATE TABLE time_frame 
  (
    id SERIAL NOT NULL
    ,start_time time
    ,end_time time
    ,PRIMARY KEY(id)
  );

CREATE TABLE donut_sales 
  (
    saleid SERIAL NOT NULL
    ,donutid INT
    ,donutname TEXT
    ,stocked timestamp
    ,sold timestamp
    ,PRIMARY KEY (saleid)
  );

--  SELECT * FROM FANCY_PIVOT_TABLE_I_DONT_UNDERSTAND
--  +---------+-------------+----------------+----------------+----------------+
--  | donutid | donutname   |  time_frame_1  |  time_frame_2  |  time_frame_3  |
--  +---------+-------------+----------------+----------------+----------------+
--  |       1 | sprinkles   |      00:17:66  |      00:17:66  |      00:17:66  |
--  |       2 | jelly       |      00:17:66  |      00:17:66  |      00:17:66  |
--  |       3 | custard     |      00:17:66  |      00:17:66  |      00:17:66  |
--  +---------+-------------+----------------+----------------+----------------+
4

1 回答 1

1

我实际上不明白时间值如何出现在您的输出表中,但是如果您想计算每个 time_frame 中售出的甜甜圈数量,您可以使用以下查询:

select
    ds.donutid, ds.donutname,
    sum(case when ts.id = 1 then 1 else 0 end) as time_frame_1,
    sum(case when ts.id = 2 then 2 else 0 end) as time_frame_2,
    sum(case when ts.id = 3 then 3 else 0 end) as time_frame_3,
    sum(case when ts.id = 4 then 4 else 0 end) as time_frame_4
from donut_sales as ds
    inner join time_frame as ts on
        ts.start_time <= ds.sold::time and ts.end_time > ds.sold::time
group by ds.donutid, ds.donutname
order by ds.donutid

sql fiddle demo

但是,您无法创建动态的 time_frames 数量,因为您无法在 PostgreSQL 的输出中创建动态列。

于 2013-08-31T10:21:58.693 回答