我有一个事务数据库,由一个名为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
感谢。
答案 0 :(得分:2)
如果我理解你的问题,这就是你想要的:
我创建了一个与您的结构类似的示例表:
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;