Netezza按周开始(星期日)和月开始分组

时间:2016-09-03 18:13:14

标签: sql date netezza

我有一个不寻常的问题。我使用Python将一些数据写入文本文件,然后我使用Tableau来读取和构建可视化。我按周对查询结果进行分组,以减小输出文件的大小。我认为SQL非常适合这种类型的操作。

SELECT [Date] - EXTRACT(DOW FROM [Date]) + 1
[this gives me the Sunday of the week for any date]

但是,我偶尔会想要按月而不是几周进行分组,这对于当前的输出是不可能的。我想要的是对查询的修改,当一周重叠两个月时,该修改将按周除外。如果一周重叠两个月,它会将结果分成第一个月的第一部分,然后是第二个月的第二部分。这样,我们可以使用输出显示每周结果或每月/每季度/每年结果,只需将Tableau中的日期分组即可。

有没有人之前解决过这样的问题?

作为示例,请考虑以下值。

2016-08-21    1
2016-08-22    1
2016-08-23    1
2016-08-24    1
2016-08-25    1
2016-08-26    1
2016-08-27    1
2016-08-28    1
2016-08-29    1
2016-08-30    1
2016-08-31    1
2016-09-01    1
2016-09-02    1
2016-09-03    1
2016-09-04    1
...           ...

我希望代码输出以下值:

2016-08-21    7
2016-08-28    4
2016-09-01    3
2016-09-04    1...

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

基于googled Netzetta syntax,这可行:

select 
min([Date]) as MinDate, count(*) as TotalDays
from YourTable
group by 
extract(year from [Date]),
extract(month from [Date]),
(case
 when extract(dow from [Date]) = 1 -- dow 1 is sunday
 then extract(week from [Date]) + 1 -- week starts on monday
 else extract(week from [Date])
 end);

或者根据评论中的建议,星期日小组:

select 
min([Date]) as MinDate, count(*) as TotalDays
from YourTable
group by
([Date] - (extract(dow from [Date]) - 1));

答案 1 :(得分:1)

这是我使用的最终代码。

CASE
WHEN EXTRACT(MONTH FROM [Date]) <> EXTRACT(MONTH FROM [Date] - EXTRACT(DOW FROM [Date]) + 1)
THEN DATE_TRUNC('month', [Date])
ELSE [Date] - EXTRACT(DOW FROM [Date]) + 1 END

然后我分组了那个领域。 它的工作方式是检查日期的月份是否等于星期的开始月份。如果不是,则返回该月的第一天。如果是,则返回周开始。此代码返回原始帖子中示例中的值。