我正在阅读七周数据库中的七个数据库,而且还有一些额外的工作问题。
问题是:
构建一个透视表,显示每个月的每一天,其中 每个月的每个星期都是一行,每天的名称形成一列 跨越顶部(七天,从星期日开始到结束 星期六)像标准的月历。每天应该包含一个 该日期的事件数量的计数,如果是,则应保持空白 没有事件发生。
提供的数据如下:
由此我为我的第一个版本创建了以下查询:
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周。所以正确的版本在周二(情人节)和周三有1(为拉尔普俱乐部活动。)
我想尝试一下,并在3月1日又增加了一行:
INSERT INTO events (title, starts, ends) VALUES
('March 1st', '2012-03-01 00:00:00', '2012-03-01 23:59:59');
然后查询返回下表:
这有点接近正确,因为它现在将星期三放在星期二14日后的第15天,但当然现在有2行,当它们在同一周。
所以存在的问题是:
答案 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