繁体   English   中英

MySQL:取得上一行

[英]MySQL: Get previous row

我有以下查询:

SELECT c.called as customer, c.calling as company, DATE_FORMAT(c.`end`,'%Y-%m-%d') as _date,

       @G := if(@prevComp <> c.calling AND @prevCust = c.called AND @prevDay = DATE_FORMAT(c.`end`,'%Y-%m-%d'), 1, 0) as Gain,
       @prevComp := c.called as prevComp,
       @prevCust := c.calling as prevCust, 
       @prevDay := DATE_FORMAT(c.`end`,'%Y-%m-%d') as prevDate

FROM cdrdata_archive c, 
     (SELECT @prevComp := 0, @prevCust := 0, @prevDay := 0) prevVals
ORDER BY c.called, DATE_FORMAT(c.`end`,'%Y-%m-%d')

但是,这将为prevCustprevCompanyprevDate输出相同的行值:

Customer      Company      Date        prevCust   prevComp   prevDate

00140443360  08434599117  2014-01-28  00140443360  08434599117  2014-01-28
00475172558  08434599218  2014-01-27  00475172558  08434599218  2014-01-27
00475172558  08434599118  2014-01-27  00475172558  08434599118  2014-01-27

所需的输出应为:

Customer      Company      Date        prevCust   prevComp   prevDate

00140443360  08834599117  2014-01-28     null          null        null 
00475172558  08834599218  2014-01-27  00140443360  08834599117  2014-01-28
00475136333  08834098771  2014-01-22  00475172558  08834599218  2014-01-27

这很棘手,因为您不能分配变量在一个语句中提取前一个值。 因此,诀窍是使用另一个变量来保存值。

以下逻辑使用case语句和dreaded = NULL获取前一天。 我之所以使用它,是因为我知道它永远不会成立,因此case语句简单地用作对变量求值进行排序的一种方法。

您的示例输出没有gain ,因此我省略了它:

SELECT c.called as customer, c.calling as company,
       DATE_FORMAT(c.`end`,'%Y-%m-%d') as _date,
       (case when (@t1 := @prevComp) = NULL then @prevComp      -- never happens
             when (@prevComp := c.called) = NULL then @prevComp -- never happens 
             else @t1
        end) as prevComp,
       (case when (@t2 := @prevCust) = NULL then @prevCust       -- never happens
             when (@prevCust := c.calling) = NULL then @prevCust -- never happens 
             else @t2
        end) as prevCust,
       (case when (@t3 := @prevDate) = NULL then @prevDate       -- never happens
             when (@prevCust := c.`end`) = NULL then @prevDate   -- never happens 
             else DATE_FORMAT(@t3,'%Y-%m-%d')
        end) as prevCust
FROM cdrdata_archive c CROSS JOIN
     (SELECT @prevComp := NULL, @prevCust := NULL, @prevDay := NULL) prevVals
ORDER BY c.called, DATE_FORMAT(c.`end`,'%Y-%m-%d');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM