【问题标题】:Group by date ranges (teradata)按日期范围分组 (teradata)
【发布时间】:2013-05-19 11:12:49
【问题描述】:

我有这样的数据:

Date             User ID
2012-10-11         a
2012-10-11         b
2012-10-12         c
2012-10-12         d 
2012-10-13         e
2012-10-14         b
2012-10-14         e

我想做的是每天按最近两天的范围(在我的实际查询中为 7 天)分组,并获取不同用户 ID 的计数。

例如,我希望结果如下所示:

Date             count(distinct userIDs)
2012-10-12         4
2012-10-13         3
2012-10-14         2

例如对于 2012-10-12,我得到了 4 个计数,因为我有 'a''b''c' 和 'd'。 ' ==> 'a''b' 来自前一天,'c''d' 来自从 2012 年 10 月 12 日同一天开始。

同样,对于 2012-10-13,我正在查看 2012-10-13 和 2012-10-12,我得到 'c', 'd',和'e'

日期列的数据类型是日期。我正在使用 Teradata。

我一直在尝试研究它,但还没有找到适用于我的情况的直接答案。 :-/ 抱歉,如果这是重复的话。非常感谢您的帮助。谢谢!

【问题讨论】:

  • 我确信有一种方法可以使用窗口函数来做到这一点,比如SELECT date, COUNT(distinct user_id) OVER (PARTITION BY date ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)(这是不正确的,我试过了)。我会自己玩这个,直到我弄明白为止!

标签: sql date group-by teradata


【解决方案1】:

我对 Teradata 语法并不完全熟悉,所以我将使用 redbrick 向您展示逻辑。

select date, count(distinct userid) records
from yourtable
where date >= dateadd(day, -2, current_date)
group by date
order by date 

编辑从这里开始

经进一步审查,如果您更换

where date >= dateadd(day, -2, current_date)

where date >= current_date - 2

那么你应该很高兴。

【讨论】:

  • 感谢您的回复。我理解逻辑,但这不会导致只有一行(因为它通过 current_date 减去 2 过滤列表中的日期)?我需要每天在表格中执行此操作。
  • @user1621315:按日期分组 一词导致 teradata(或任何数据库,因为它是“正常”SQL)计算一天中不同的(不同的)用户 ID按天计算。用户 ID 按日期分组,然后进行计数。
  • @user1621315,也许您可​​以详细说明“最近两天范围”这个术语。这就是 current_date -2 上的过滤器的启发。
  • 很抱歉给您带来了困惑。我的意思是最近相对于我在日期列中看到的所有日期。
【解决方案2】:

要做你想做的事,你实际上需要“乘以”数据,因为每一行都可以包含在两个日期中以进行最终聚合。

我认为最简单的方法是union all 方法:

select date, count(distinct userId)
from ((select date, UserId
       from t
      ) union all
      (select date + 1, UserId     -- combine with yesterday's data
       from t
      )
     ) t
group by date;

因为您要处理 7 天,所以这里有另一种方法:

select (t.date + n), count(distinct t.UserId)
from t cross join
     (select 0 as n union all select 1 union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
     ) n
group by t.date + n;

【讨论】:

  • 谢谢 Gordon,这实际上与我最终做的类似(除了我认为在第五行使用 'date+1' 可能更正确,因为例如,我想看看今天组中的昨天的用户)我将在单独的帖子中提供我的方法。
  • @user1621315 。 . .我明白你在说什么。我更改了答案中的符号。
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 2021-11-16
  • 2010-10-31
  • 2016-09-22
  • 2019-02-19
  • 2019-02-14
相关资源
最近更新 更多