Netezza 按周开始(星期日)和月开始分组
Netezza Grouping by Week Start (Sunday) AND Month Start
我有一个不寻常的问题。我正在使用 Python 将一些数据写入一个文本文件,然后我使用 Tableau 从中读取数据并构建可视化效果。我按周对查询结果进行分组,以减小输出文件的大小。我认为 SQL 是此类操作的标准。
SELECT [Date] - EXTRACT(DOW FROM [Date]) + 1
[this gives me the Sunday of the week for any date]
但是,我偶尔想按月而不是周分组,这对于当前输出是不可能的。我想要的是对查询的修改,该查询将按周分组,但当一周与两个月重叠时除外。如果一周与两个月重叠,它会将结果拆分为第一个月的一周的第一部分,然后是第二个月的一周的第二部分。这样,我们可以使用输出来显示每周结果或 monthly/quarterly/yearly 结果,只需在 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...
非常感谢任何帮助!
基于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));
这是我使用的最终代码。
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
然后我在那个字段上分组。
它的工作方式是检查日期的月份是否等于一周开始的月份。如果不是,则 returns 该月的第一天。如果是,则 returns 周开始。此代码 returns 来自原始示例中的值 post.
我有一个不寻常的问题。我正在使用 Python 将一些数据写入一个文本文件,然后我使用 Tableau 从中读取数据并构建可视化效果。我按周对查询结果进行分组,以减小输出文件的大小。我认为 SQL 是此类操作的标准。
SELECT [Date] - EXTRACT(DOW FROM [Date]) + 1
[this gives me the Sunday of the week for any date]
但是,我偶尔想按月而不是周分组,这对于当前输出是不可能的。我想要的是对查询的修改,该查询将按周分组,但当一周与两个月重叠时除外。如果一周与两个月重叠,它会将结果拆分为第一个月的一周的第一部分,然后是第二个月的一周的第二部分。这样,我们可以使用输出来显示每周结果或 monthly/quarterly/yearly 结果,只需在 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...
非常感谢任何帮助!
基于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));
这是我使用的最终代码。
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
然后我在那个字段上分组。 它的工作方式是检查日期的月份是否等于一周开始的月份。如果不是,则 returns 该月的第一天。如果是,则 returns 周开始。此代码 returns 来自原始示例中的值 post.