我有一个不寻常的问题。我使用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...
非常感谢任何帮助!
答案 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
然后我分组了那个领域。 它的工作方式是检查日期的月份是否等于星期的开始月份。如果不是,则返回该月的第一天。如果是,则返回周开始。此代码返回原始帖子中示例中的值。