mysql内部联接在self上,与以前的记录匹配

mysql内部联接在self上,与以前的记录匹配,mysql,Mysql,我有一个事务数据库,由一个名为flaglesscontracid的参数映射。其中,cp_标志可以是“ca”或“pu”。我试图在1个查询中获得一个结果集,该结果集在行上包含一个交易价格(PRC_O和PRC_C)以及该合同上的上一个交易(FlaglesContractId相同) 我想应该是这样的 select t.PRC_O, t.PRC_C, t.flaglessContractID, t.cp_flag from currDataF1 t INNER JOIN # here is where

我有一个事务数据库,由一个名为flaglesscontracid的参数映射。其中,cp_标志可以是“ca”或“pu”。我试图在1个查询中获得一个结果集,该结果集在行上包含一个交易价格(PRC_O和PRC_C)以及该合同上的上一个交易(FlaglesContractId相同)

我想应该是这样的

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 

谢谢。

如果我正确理解了你的问题,这就是你想要的:

我创建了一个与您的结构类似的示例表:

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中添加where子句,该子句只显示“ca”或“pu”行

如果需要不同顺序的数据,只需添加一个外部select语句

以下是查询:

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;

MySQL不支持LEAD/LAG真糟糕:试试@igelkott谢谢,但我在DB上没有创建函数的特权。“explainextended”页面中的第二个解决方案不需要函数。当然,这是一个慢版本,所以可能没有用。