【问题标题】:MySql: Get next row valuesMySql:获取下一行值
【发布时间】:2015-02-11 21:25:00
【问题描述】:

这是表中的示例数据集:

|  callid    |   called     |   calling   |        end          | 
|------------|--------------|-------------|---------------------|
| 1411482360 | 001143792042 | 08444599175 | 2014-07-31 13:55:03 |
| 1476992122 | 001143792042 | 08441713191 | 2014-07-31 14:05:10 |

到目前为止,我已经设法获得了前一行的值,并且我还需要下一行的值。这是我的查询:

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 @prevDate = DATE_FORMAT(c.`end`,'%Y-%m-%d'), 1, 0) as Gain,
        @prevCust := c.called as prevCust,
        @prevComp := c.calling as prevComp,
        @prevDate := DATE_FORMAT(c.`end`,'%Y-%m-%d') as prevDate
FROM cdrdata_archive c CROSS JOIN
     (SELECT @prevComp := NULL, @prevCust := NULL, @prevDate := NULL) prevVals
ORDER BY c.called, c.`end` 

以上查询返回如下结果集:

Customer     Company      Date        prevCust     prevComp     prevDate     Gain

00140443360  08434599117  2014-01-28  00140443360  08434599117  2014-01-28   0
00475172558  08434599218  2014-01-27  00475172558  08434599218  2014-01-27   0
00475172558  08434593455  2014-01-27  00475172558  08434599118  2014-01-27   1

我需要上一行和下一行的值来计算每家公司的丢失和获得的电话。我设法获得了正确的增益值,但是为了计算 Lost 值(类似于 Gain 但在一个新列中),我需要下一个客户、公司和日期

是否可以在不花费太多成本的情况下将其安装到此查询中,还是我需要重写它?

【问题讨论】:

标签: mysql sql


【解决方案1】:

使用 MySQL LIMIT 子句进行研究。您的行以ORDER BY 返回,因此您确实有订单,但您没有“列表中的数字”,即 LIMIT

所以你有你的查询 - 并在 SQL 的末尾附加

LIMIT $x, 1 你有LIMIT &lt;offset&gt;, &lt;count&gt; 所以你的计数是你的行(1),每次你进入“下一个”行时,你都会改变

$x = $x + 1

希望这会有所帮助。 http://www.mysqltutorial.org/mysql-limit.aspx

因此,对于您显示的类型的 第三个 查询将是:

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 @prevDate = DATE_FORMAT(c.`end`,'%Y-%m-%d'), 1, 0) as Gain,
        @prevCust := c.called as prevCust,
        @prevComp := c.calling as prevComp,
        @prevDate := DATE_FORMAT(c.`end`,'%Y-%m-%d') as prevDate
FROM cdrdata_archive c CROSS JOIN
     (SELECT @prevComp := NULL, @prevCust := NULL, @prevDate := NULL) prevVals
ORDER BY c.called, c.`end` LIMIT 2,1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2015-07-30
    • 2012-01-09
    • 2015-02-12
    • 2014-10-29
    • 2010-10-31
    相关资源
    最近更新 更多