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行之后,但当然现在有两行,当它们在同一周时
因此,存在的问题是:
你能试着把地点周改成最热门的月份吗 比如:
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