在postgres中使用交叉表创建类似于表的日历

时间:2016-01-07 21:07:14

标签: postgresql crosstab

我正在阅读七周数据库中的七个数据库,而且还有一些额外的工作问题。

问题是:

  

构建一个透视表,显示每个月的每一天,其中   每个月的每个星期都是一行,每天的名称形成一列   跨越顶部(七天,从星期日开始到结束   星期六)像标准的月历。每天应该包含一个   该日期的事件数量的计数,如果是,则应保持空白   没有事件发生。

提供的数据如下:

Supplied data

由此我为我的第一个版本创建了以下查询:

SELECT * FROM crosstab(
    'SELECT extract(month from starts) as month
    ,extract(WEEK from starts) as week 
    ,extract(DOW from starts) as day
    ,count(*) FROM events GROUP BY month, week, day'
    ,'SELECT * FROM generate_series(0, 6)') 
AS 
    (month int
     ,week int
     ,Sunday int, Monday int, Tuesday int, Wednesday int
     ,Thursday int, Friday int, Saturday int) 
ORDER BY week

然后创建了下表: First data result

这里有两个问题,但我只想关注一个问题。

我不确定为什么2月15日的事件会在第6周出现,当时它应该出现在第7周。所以正确的版本在周二(情人节)和周三有1(为拉尔普俱乐部活动。)

我想尝试一下,并在3月1日又增加了一行:

INSERT INTO events (title, starts, ends) VALUES
('March 1st', '2012-03-01 00:00:00', '2012-03-01 23:59:59');

然后查询返回下表:

After extra data

这有点接近正确,因为它现在将星期三放在星期二14日后的第15天,但当然现在有2行,当它们在同一周。

所以存在的问题是:

  1. 修复周三浮动的第15个问题。
  2. 让同一周的日子出现在同一行。

1 个答案:

答案 0 :(得分:2)

您可以尝试将位置周更改为最高月份 像:

SELECT * FROM crosstab(
    'SELECT 
    extract(WEEK from starts) as week 
    ,extract(month from starts) as month
    ,extract(DOW from starts) as day
    ,count(*) FROM events GROUP BY month, week, day'
    ,'SELECT * FROM generate_series(0, 6)') 
AS 
    (
     week int,month int
     ,Sunday int, Monday int, Tuesday int, Wednesday int
     ,Thursday int, Friday int, Saturday int) 
ORDER BY week