mysql内部联接在self上,与以前的记录匹配
我有一个事务数据库,由一个名为flaglesscontracid的参数映射。其中,cp_标志可以是“ca”或“pu”。我试图在1个查询中获得一个结果集,该结果集在行上包含一个交易价格(PRC_O和PRC_C)以及该合同上的上一个交易(FlaglesContractId相同) 我想应该是这样的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
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”页面中的第二个解决方案不需要函数。当然,这是一个慢版本,所以可能没有用。