【问题标题】:Getting previous row in MySQL获取 MySQL 中的上一行
【发布时间】:2016-10-20 12:34:42
【问题描述】:

我遇到了一个 MySQL 问题,我还没有找到解决方案。我有以下查询,可以为我带来平台中每个时期的月份和新用户数量:

select  
    u.period ,
    u.count_new as new_users
from 
(select DATE_FORMAT(u.registration_date,'%Y-%m') as period, count(distinct u.id) as count_new from users u group by DATE_FORMAT(u.registration_date,'%Y-%m')) u
order by period desc;

结果是表格:

period,new_users
2016-10,103699
2016-09,149001
2016-08,169841
2016-07,150672
2016-06,148920
2016-05,160206
2016-04,147715
2016-03,173394
2016-02,157743
2016-01,173013

因此,我需要计算每个月-年的期间与上个月-年之间的差异。我需要这样的结果表:

period,new_users
2016-10,calculate(103699 - 149001)
2016-09,calculate(149001- 169841)
2016-08,calculate(169841- 150672)
2016-07,So on...
2016-06,...
2016-05,...
2016-04,...
2016-03,...
2016-02,...
2016-01,...

任何想法:=/

谢谢

【问题讨论】:

  • 是的 - 自加入
  • 这在我的情况下应该如何工作?
  • 您再次重复派生表中的查询,然后使用第二个派生表中一个月前的时间段将这两个相互连接起来。

标签: mysql sql database


【解决方案1】:

您应该能够使用与我发布的in another S/O question. 类似的方法,您的起步不错。您让您的内部查询获取计数并按照您需要的最终方向对其进行排序。通过使用内联 mysql 变量,您可以拥有上一条记录值的保存列,然后将其用作下一个结果的计算基础,然后将变量设置为新的余额以用于每个后续循环。

到 SqlVars 别名的 JOIN 没有任何“ON”条件,因为 SqlVars 无论如何只会返回一行并且不会产生任何笛卡尔积。

select  
    u.period,
    if( @prevCount = -1, 0, u.count_new - @prevCount ) as new_users,
    @prevCount := new_users as HoldColumnForNextCycle    
   from 
      ( select 
              DATE_FORMAT(u.registration_date,'%Y-%m') as period, 
              count(distinct u.id) as count_new 
           from 
              users u 
           group by 
              DATE_FORMAT(u.registration_date,'%Y-%m') ) u
      JOIN ( select @prevCount := -1 ) as SqlVars
   order by 
      u.period desc;

您可能需要稍微尝试一下,因为计数没有“起始”点,因此任一排序方向的第一个条目可能看起来很奇怪。我将“@prevCount”变量作为-1 开始。因此,处理的第一条记录在“new_users”列中获得了新的用户计数 0。然后,无论记录的新用户计数是什么,然后我都将其分配回@prevCount,作为处理所有后续记录的基础。是的,它是结果集中的一个额外列,可以忽略,但需要。同样,它只是一个每行占位符,您可以在结果查询中看到它是如何随着每一行的进展而获得其值的......

【讨论】:

  • @Polly,很高兴它做到了。另外,请查看网站礼仪的帮助/导览。标记有帮助的答案,解决后单击复选框可以帮助其他人了解他们遇到的类似问题的解决方法。
【解决方案2】:

我会创建一个包含两列的临时表,然后使用光标填充它 做这样的事情(不记得确切的语法 - 所以这只是一个伪代码):

@val = CURSOR.col2 - (select col2 from OriginalTable t2 where (t2.Period = (CURSOR.Period-1) ))) 

INSERT tmpTable (Period, NewUsers) Values ( CURSOR.Period, @val)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 2010-10-31
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2019-01-14
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多