2010-09-30 79 views
2

我有一個事務數據庫,由一個名爲flaglessContractID的參數映射。其中有cp_flag,可能是'ca'或'pu'。我想在1個查詢以獲得一個結果集,它在一個行包含一個交易價格(PRC_O和PRC_C),而且合同上一交易(flaglessContractID是一樣的)mysql內部加入自我,匹配以前的記錄

我認爲這會是這樣的

select t.PRC_O, t.PRC_C, t.flaglessContractID, t.cp_flag 
from currDataF1 t INNER JOIN 
# here is where it is fuzzy for me. The subquery I want for each row is): 
select p.PRC_O, p.PRC_C 
from currDataF1 
where t.flaglessContractID > p.flaglessContractID) 
    AND t.flaglessContractID = 'ca' 
    and p.flaglessContractID = 'ca' 
order by p.flaglessContractID desc limit 1 

謝謝。

+1

吮吸MySQL不支持LEAD/LAG:http://techonthenet.com/oracle/functions/lag.php – 2010-09-30 22:09:17

+0

嘗試http://explainextended.com/2009/03/12/analytic-functions-optimize-lag-lead-first_value-last_value/ – igelkott 2010-09-30 22:37:21

+0

@igelkott謝謝但我沒有創建函數的DB權限。 I – stevejb 2010-09-30 22:57:27

回答

2

如果我明白你的問題正確的,這是你想要什麼:

MYSQL Lag using variables

我已經創建了一個示例表具有相似的結構,以你的:

create table currDataF1 (
    id int, 
    flaglessContractID int, 
    PRC_O decimal(4,2), 
    PRC_C decimal(4,2), 
    cp_flag varchar(2) 
); 

insert into currDataF1(id,flaglessContractID,PRC_O,PRC_C,cp_flag)values 
(1,1,10.00,10.50,'ca'), 
(2,2,20.00,20.50,'ca'), 
(3,1,11.00,11.50,'ca'), 
(4,1,12.00,12.50,'pu'), 
(5,2,21.00,21.50,'ca'), 
(6,3,30.00,30.50,'ca'), 
(7,4,40.00,40.50,'pu'), 
(8,4,41.00,41.50,'pu'); 

然後我用變量以存儲以前的'無標籤合同ID'的詳細信息。由於您只想使用相同的ID顯示上一份合同的詳細信息,因此您必須確保表格的順序是正確的(我使用了ID,但您可能有日期?)。

可以將where子句添加到僅顯示'ca'或'pu'行的SQL中。

如果您需要不同順序的數據,只需添加一個外部選擇語句。

下面是該查詢:

select 
    id, 
    if(
     (@flaglessContractID_lag:[email protected]) = (@flaglessContractID:=flaglessContractID), 
     if(
      (@cp_flag_lag:[email protected]_flag) + (@PRC_O_lag:[email protected]_O) + (@PRC_C_lag:[email protected]_C), 
      @flaglessContractID, 
      @flaglessContractID), 
     if(
      (@PRC_O_lag:=null) + 
      (@PRC_C_lag:=null) + 
      (@cp_flag_lag:=null), 
      null, 
      @flaglessContractID 
     ) 
    ) flaglessContractID, 
    (@PRC_O:=PRC_O) PRC_O, 
    (@PRC_C:=PRC_C) PRC_C, 
    (@cp_flag:=cp_flag) cp_flag, 
    @PRC_O_lag PRC_O_lag, 
    @PRC_C_lag PRC_C_lag, 
    @cp_flag_lag cp_flag_lag 
from 
    currDataF1 c, 
    (select @flaglessContractID:=0) vars 
order by c.flaglessContractID , c.id;