2015-02-11 144 views
0

下面是從表中的樣本數據集:MySQL的:獲取下一行值

| 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但在一個新的專欄中),我需要下一位客戶,公司和日期

這可以適合這個查詢沒有太多的成本或我需要重寫它嗎?

+0

是否http://stackoverflow.com/questions/27160298/referencing-next-and-previous-row-值有幫助? – Barmar 2015-02-11 21:28:49

回答

0

研究使用MySQL LIMIT子句。你行與ORDER BY所以你有一個訂單返回,但你沒有,這限制是

因此,一個「列表中的號碼」你有你的查詢 - 並在SQL結束時,你追加

LIMIT $x, 1,你必須LIMIT <offset>, <count>所以你數是你的行(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