加入具有相同表的先前记录的表

时间:2016-09-29 12:26:53

标签: mysql sql

我有一张包含历史记录的表,在主表中通过几个触发器发布。我想在历史记录表上创建一个select语句,其中每个记录按其先前记录JOINed(由相同的LineID和最高的ActionDate标识),因此我可以提取这两者之间的差异。

我试过这个,但是(我的)SQL不允许引用JOINED子选择中的第一个“FROM”表:where子句中的未知列h1.LineID

select 
  h1.*, 
  prev.* 
from history h1
LEFT OUTER JOIN 
  (Select * 
     From history h2 
     where  h1.LineID=h2.LineID and h2.ActionDate < h1.ActionDate 
     order by Actiondate desc limit 1
  ) prev on h1.LineID=prev.LineID

我该如何做到这一点?

3 个答案:

答案 0 :(得分:5)

您可以使用以下方式获取对上一行的引用:

select h.*,
       (select h2.ActionDate
        from history h2
        where h2.LineId = h.LineId and h2.ActionDate < h.ActionDate
        order by h2.ActionDate desc
        limit 1
       ) as prev_ActionDate
from history h;

如果您想要完整的行,可以使用join来获取数据:

select h.*, hprev.*
from (select h.*,
             (select h2.ActionDate
              from history h2
              where h2.LineId = h.LineId and h2.ActionDate < h.ActionDate
              order by h2.ActionDate desc
              limit 1
             ) as prev_ActionDate
      from history h
     ) h left join
     history hprev
     on hprev.LineId = h.LineId and hprev.ActionDate = h.prev_ActionDate;

答案 1 :(得分:1)

请使用以下代码

从历史记录中选择*作为内部联接历史记录,如pre.ActionDate&lt; h.ActionDate和prev.LineID = h.LineID

希望它会对你有所帮助。

答案 2 :(得分:0)

使用以下代码自行解决:

select * 
from history h1
LEFT OUTER JOIN history h2 on h1.LineID=h2.LineID 
    and h2.ActionDate = (select max(actiondate) 
                         from history h3 
                         where h3.LineID=h1.LineId and h3.Actiondate < h1.ActionDate
                        )
order by h1.actiondate desc;