我一直在研究这个问题。基本上我有一组UserId和TimeStamp的简单数据。我想知道每周有多少不同的UserId出现,我的周是在周日 - 周六,而不是周一 - 周日测量的,这是Weekofyear()使用的。
现在我每周都要硬编码并运行查询:
SELECT
count(distinct UserId)
FROM data.table
where from_unixtime((CAST(timestamp as BIGINT)))
between TO_DATE("2016-06-05") AND TO_DATE("2016-06-12")
我试图找到一种方法将时间戳改回一天,以欺骗周年,以为我的星期日实际上是星期一,但没有成功。我最近的徒劳尝试看起来像:
SELECT
count(distinct UserId), weekofyear(date_sub(from_unixtime(CAST(timestamp as BIGINT)),1))
FROM table.data
where from_unixtime((CAST(timestamp as BIGINT)))
between TO_DATE("2016-06-01") AND TO_DATE("2016-06-30")
group by weekofyear(date_sub(from_unixtime(CAST(timestamp as BIGINT)),1))
这导致相同的数字,好像我没有减去一天。我不确定为什么这不起作用。我觉得应该有办法管理这个。现在,如果我想按周将所有数据提取到WHERE X为真,我必须每周手动完成,这是不可持续的。关于如何更聪明地工作的任何建议?
谢谢。
答案 0 :(得分:1)
简单解决方案
您可以简单地创建自己的公式,而不是使用“一年中的一周”的预定义功能 优势:您可以在一周内完成7天的任何一套。
在您的情况下,因为您希望本周应该从周日至周六开始,我们只需要一年中的第一个星期日
例如 - 2016年,第一个星期日是'2016-01-03',即2016年1月3日 - 考虑格式为'yyyy-mm-dd'的时间戳列的假设
SELECT
count(distinct UserId), lower(datediff(timestamp,'2016-01-03') / 7) + 1 as week_of_the_year
FROM table.data
where timestamp>='2016-01-03'
group by lower(datediff(timestamp,'2016-01-03') / 7) + 1;