2016-09-03 123 views
1

我有一点不寻常的问题。我使用Python将一些数据写入文本文件,然后使用Tableau从中读取并生成可视化文件。我将查询结果按周分组以减少输出文件的大小。我认为SQL对于这种类型的操作非常标准。Netezza按周开始(星期日)和月开始分组

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... 

将非常感谢您的帮助!

+0

将数据加载到Tableau的日常级别并在那里进行日期操作。 –

+0

是的,这是一个选项,但我试图避免它由于数据量。按周/月分组会使Tableau数据文件处理大小的1/6(​​或者类似的情况,不确定具体的值,但它会小得多) – SeaChange

回答

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)); 
+0

是的,我不知道为什么它没有黎明对我来说,只是最低限度的聚合日期,然后按月和周分组。尚未测试,但以下应该工作:GROUP BY EXTRACT(MONTH FROM [Date]),[Date] - EXTRACT(DOW FROM [Date])+ 1 – SeaChange

+0

仅在星期日分组也是有效的,更短的方法。在我的高尔夫球编码批准;)我已经添加到答案。 – LukStorms

0

下面是我使用的最终代码。

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 

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

相关问题