【问题标题】:Current day and Previous 30 day distinct count当天和前 30 天的不同计数
【发布时间】:2021-08-25 12:13:31
【问题描述】:

我有一个数据集,我正试图将其相互连接以获取前 30 天的计数。初始表具有针对一天给出的不同的 id 计数。我的最终目标是通过自己加入来获取当前天数和前 x(当前示例为 30)天数,这样我就可以计算从第 1 天到第 30 天前的滚动 30 平均值。

到目前为止,结构已经确定,但不确定是否最好。

原来的表是

Day.       id.               group
12/1/2020.  1.               A
12/2/2020.  1.               A
12/3/2020.  2.              B
12/3/2020.  3.              B
12/3/2020.  4.              B
12/4/2020.  1.              A
12/4/2020.  2.              A
12/4/2020.  3.              A
12/4/2020.  4.              A
.
.
.
1/30/2021.  1.               A

我使用原始表每天进行不同的计数

Day.       Count_prev30.   group
12/1/2020.  83.               A
12/2/2020.  93.               A
12/3/2020.  103.              B
12/4/2020.  126.              A
.
.
.
1/4/2021.  166.               A

目前我拿这张桌子,还做了一个 date_sub(partition_date_et, 29) partition_date_et_30 并有另一个设置在哪里

Day.       Day_previous_30 Count_current.   group
1/1/2021.  12/01/2020       123.               A
1/2/2021.  12/02/2020       133.               A
1/3/2021.  12/03/2020       143.               B
1/4/2021.  12/04/2020       166.               A
.
.
.
1/31/2021.  12/31/2020       186.               A

我加入了这些数据集,所以我使用 Day 和 Day_previous_30

Day.       Day_previous_30 Count_current.   count_prev30      group
1/1/2021.  12/01/2020       123.            83                  A
1/2/2021.  12/02/2020       133.            93                  A
1/3/2021.  12/03/2020       143.            103                 A
1/4/2021.  12/04/2020       166.            126                 B
.
.
.
.
infinite dates

我不确定这是否是在我的聚合中获取当前日期和当前日期的最佳方法对于 2021 年 1 月 1 日,我的平均计数是 Count_current + Count_prev30 /2。

只是想看看如果有更好的方法,其他人将如何实现这一点。我不认为有一个计数不同的窗口函数,比如 sum over。

【问题讨论】:

  • 请解释您要完成的工作。你在寻找什么结果?你怎么知道 2020-12-01 比 2021-01-01 早 29 天?而count_current 是从哪里来的?
  • 谢谢,我以为我已经解释清楚了。更新了更多上下文。 @GordonLinoff
  • 这两组数据是固定的还是你为一个表获取它们?
  • @banana_99 我从一张桌子上获得。
  • @epv 能否请您给我们展示您的一张桌子,以便我们想出一些更容易的方法?有很多功能可以一步轻松实现。

标签: sql hive count distinct-values


【解决方案1】:

假设您每天都有数据,您可以使用:

select day, count(*),
       sum(count(*)) over (order by day range between 29 preceding and current row)
from t
group by day;

您的代码显示了一个group 列,但问题根本没有提到它,所以这只是忽略它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多