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

Postgresql 在postgres中使用交叉表创建类似日历的表,postgresql,crosstab,Postgresql,Crosstab,我在七周的书中浏览了七个数据库,有点困在了一个额外的工作问题上 问题是: 构建一个数据透视表,该数据透视表在一个月内每天都显示,其中 每月的每个星期都是一行,每天的名称形成一列 跨越顶部(七天,从星期天开始,到星期天结束) 星期六)类似于标准的月历。每天都应该包含一个 该日期的事件数计数,如果 没有发生任何事件 提供的数据如下: 在此基础上,我为我的第一个版本创建了以下查询: SELECT * FROM crosstab( 'SELECT extract(month from star

我在七周的书中浏览了七个数据库,有点困在了一个额外的工作问题上

问题是:

构建一个数据透视表,该数据透视表在一个月内每天都显示,其中 每月的每个星期都是一行,每天的名称形成一列 跨越顶部(七天,从星期天开始,到星期天结束) 星期六)类似于标准的月历。每天都应该包含一个 该日期的事件数计数,如果 没有发生任何事件

提供的数据如下:

在此基础上,我为我的第一个版本创建了以下查询:

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
然后创建了下表:

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

我不知道为什么2月15日的活动会出现在第6周,而它应该出现在第7周。因此,正确的版本在周二(情人节)和周三(Larp俱乐部活动)分别为1和1

我想尝试一下,并为3月1日添加了另一行:

INSERT INTO events (title, starts, ends) VALUES
('March 1st', '2012-03-01 00:00:00', '2012-03-01 23:59:59');
然后查询返回下表:

这有点接近正确,因为它现在把星期三定为第15行,在星期二定为第14行之后,但当然现在有两行,当它们在同一周时

因此,存在的问题是:

  • 在第15个星期三修复浮动问题
  • 让同一周中的几天出现在同一行中

  • 你能试着把地点周改成最热门的月份吗 比如:

    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