如何在不使用自连接的情况下汇总 MySQL 中每一行的前 30 天?

Posted

技术标签:

【中文标题】如何在不使用自连接的情况下汇总 MySQL 中每一行的前 30 天?【英文标题】:How to aggregate its previous 30 days for each line in MySQL without using self-join? 【发布时间】:2018-06-22 13:46:13 【问题描述】:

假设我们有一个名为UserSessions 的表。每个用户可以在一天内或在不同的日子有多个会话。该表的列是

UserSessions table: 
---------------------
SessionID (int) PK, 
UserID (int), 
datetime (datetime) 

示例数据如下所示:

1, 1001, 2017-01-01  
2, 1001, 2017-01-01  
3, 1002, 2017-01-01   
4, 1002, 2017-01-02  
...  

现在,我们要编写一个查询,显示过去 30 天内每天的不同用户数。最好的方法是什么?

一个明显的解决方案是使用自联接,但我们希望我们可以避免这种情况。 它与窗口功能有关吗?我想知道是否有一个功能,对于每一行,我们可以在 x 行前面和 y 行之后聚合。

例如,类似的问题,例如“到目前为止记录的每一天前 30 天的窗口中橙色的平均价格是多少”等。更具体地说,这就像询问 x-30 期间的聚合第 x 天到 x-1 天。

【问题讨论】:

'我想避免这种情况' 【参考方案1】:

你可以通过..eg来使用一个组:

  select UserId, count(*)
  from my_table 
  where datetime between date_sub(now(), interval 30 day ) 
                        AND date_sub(now(), interval 1 day )
  group by UserID

【讨论】:

以上是关于如何在不使用自连接的情况下汇总 MySQL 中每一行的前 30 天?的主要内容,如果未能解决你的问题,请参考以下文章