mysql内连接在self上,匹配以前的记录

时间:2010-09-30 21:58:13

标签: mysql

我有一个事务数据库,由一个名为flaglessContractID的参数映射。其中,有cp_flag可以是'ca'或'pu'。我试图在1个查询中得到一个结果集,其中包含一个交易价格(PRC_O和PRC_C)以及该合约上的前一个交易(flaglessContractID是相同的)

我认为它会像

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 个答案:

答案 0 :(得分: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');

然后我使用变量来存储先前的'flaglessContractID'细节。由于您只想显示具有相同ID的上一个合同的详细信息,您必须确保您的表的顺序正确(我使用了ID,但您可能有一个日期?)。

可以在SQL中添加一个只显示'ca'或'pu'行的where子句。

如果您需要不同顺序的数据,只需添加外部选择语句。

以下是查询:

select 
    id,
    if(
        (@flaglessContractID_lag:=@flaglessContractID) = (@flaglessContractID:=flaglessContractID),
        if(
            (@cp_flag_lag:=@cp_flag) + (@PRC_O_lag:=@PRC_O) + (@PRC_C_lag:=@PRC_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;