我研究这个问题已经有一段时间了。基本上,我有一组简单的数据,包括用户ID和时间戳。我想知道每周有多少个不同的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))
结果是相同的数字,就像我没有减去一天一样。我不知道为什么这样不行。我觉得应该有办法解决这个问题。现在如果我想按周提取x为真的所有数据,我必须每周手动提取,这是不可持续的。对如何更聪明地工作有什么建议吗?
谢谢您。
1条答案
按热度按时间mxg2im7a1#
简单的解决方案
您可以简单地创建自己的公式,而不必使用“一年中的一周”的预定义函数优势:您可以在一周内使用任何一组7天。
在你的情况下,既然你希望一周从星期天开始,我们只需要一年中星期天的第一个日期
例如,2016年的第一个星期天是2016年1月3日,即2016年1月16日的第3个星期天——假设时间戳列的格式为“yyyy-mm-dd”