通过连接监听最大日期

时间:2015-11-03 08:31:12

标签: sql firebird greatest-n-per-group firebird2.5

我有两个表容器和LISTE_RECEPTD 我想选择值为enstock = 1并且存在于LISTE_RECEPTD表中的容器,其中最后一个收货日期为max(rec_date)。 注意到LISTE_RECEPTD中可以存在多次数字。

关系

relation

竞赛表

conteneur table

LISTE_RECEPTD

LISTE_RECEPTD

我创建了一个程序 我有一个错误结果的问题。

    begin
FOR SELECT  conteneurs.numero FROM conteneurs
WHERE conteneurs.enstock=1
    INTO :NUMERO
DO
BEGIN
  FOR SELECT first 1  liste_receptd.recept_n ,max(liste_receptd.rec_date)    
 FROM liste_receptd
  where  liste_receptd.cont_numero=: NUMERO
    group BY liste_receptd.recept_n
  into :RECEPTION_N,:DATE_RECEPTION DO
              SUSPEND;
suspend;
end

END

结果

the result

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

我认为结果是好的,除了重复的行。如果您只想选择一行,只需删除suspend命令之一。

  ......... 
    group BY liste_receptd.recept_n
  into :RECEPTION_N,:DATE_RECEPTION DO
              SUSPEND;
suspend; <-- REMOVE THIS
end

或删除第二个&#39; FOR&#39; 像这样:

begin
FOR SELECT  conteneurs.numero FROM conteneurs
WHERE conteneurs.enstock=1
    INTO :NUMERO
DO
  BEGIN
   SELECT first 1  liste_receptd.recept_n ,max(liste_receptd.rec_date)    
   FROM liste_receptd
   where  liste_receptd.cont_numero=:NUMERO
   group BY liste_receptd.recept_n
   into :RECEPTION_N,:DATE_RECEPTION;
   SUSPEND;
  END
end

答案 1 :(得分:0)

为此,您需要使用子查询查找每个库存项目的最高日期,然后选择与该日期和库存项目相关联的收件人:

select s.*, r.*
from stock s
inner join (
    select max(rec_date) as max_rec_date, stockid
    from receival
    group by stockid
) latest
    on latest.stockid = s.id
inner join receival r
    on r.stockid = latest.stockid 
       and r.rec_date = latest.max_rec_date

如果您只想要最近收到的库存商品,可以简化为:

select s.*, latest.*
from stock s
inner join (
    select max(rec_date) as max_rec_date, stockid
    from receival
    group by stockid
) latest
    on latest.stockid = s.id

答案 2 :(得分:0)

我更改了视图&#34; LISTE_RECEPTD&#34;

LISTE_RECEPTD

select 
    reception.recept_n,
    reception.rec_date,
    reception_d.cont_numero,
    conteneurs.enstock
from reception_d
   left outer join reception on (reception_d.recept_n = reception.recept_n)
   inner join conteneurs on (reception_d.cont_numero = conteneurs.numero)

因此,我有这个完成工作的查询

select distinct a.cont_numero NUMERO,a.rec_date  DATE_RECEPTION  ,
a.recept_n
from  liste_receptd a
where
(a.enstock=1 )
and (a.rec_date)=(select first 1 max(d.rec_date) last_date from  liste_receptd d where
a.cont_numero=d.cont_numero
group by d.rec_date
order by d.rec_date desc)

order by a.rec_date ,a.recept_n asc
;