Sql 用join列出最大日期

Sql 用join列出最大日期,sql,firebird,greatest-n-per-group,firebird2.5,Sql,Firebird,Greatest N Per Group,Firebird2.5,我有两张桌子,一张是集装箱,一张是收据 我想选择值为enstock=1的容器,这些容器存在于LISTE_RECEPTD表中,仅具有最后一个接收日期max(rec_date)。 注意,一个数字可以在LISTE_RECEPTD中存在多次 关系 内容表 LISTE_RECEPTD 我创建了一个程序 问题是我有一个错误的结果 begin FOR SELECT conteneurs.numero FROM conteneurs WHERE conteneurs.enstock=1

我有两张桌子,一张是集装箱,一张是收据 我想选择值为enstock=1的容器,这些容器存在于LISTE_RECEPTD表中,仅具有最后一个接收日期max(rec_date)。 注意,一个数字可以在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
结束

结果


感谢您的帮助

我很高兴结果很好,除了重复的行。如果只需要选择一行,只需删除
suspend
命令中的一行即可

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

我认为结果是好的,除了重复的行。如果只需要选择一行,只需删除
suspend
命令中的一行即可

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

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

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

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

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
我更改视图“LISTE\u RECEPTD”

李斯特 因此,我有这个查询来完成这项工作

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
;
我更改视图“LISTE\u RECEPTD”

李斯特 因此,我有这个查询来完成这项工作

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
;

TOW BEGIN TOW END,“SQL错误代码=-104。命令行21第1列意外结束。”我只是复制并编辑了代码的一部分。请参阅上次更新。没有测试,但这是方法。是的,它的工作与错误“算术异常,数字溢出,或字符串截断w”和新行=“null”,无论如何,谢谢,我找到了解决方案,但不是一个过程开始拖结束,“SQL错误代码=-104。意外结束的命令行21,第1列。”我只是复制和编辑您的代码的一部分。请参阅上次更新。未测试,但这就是方法。是的,它的工作方式有错误“算术异常、数值溢出或字符串截断w”和新行=“null”,无论如何,谢谢,我找到了解决方案,但没有使用过程。您的存储过程不必要地复杂(并尝试执行内部联接)。您的存储过程不必要地复杂(并尝试执行内部联接的用途).LISTE_RECEPTD在此视图中没有idview@kovarov我的查询旨在演示解决方案,它不是解决您问题的确切查询。请使用
cont\u numero
,而不是id。非常感谢,这是我的服务,我找到了解决方案,但没有使用过程。RECEPTD在此中是查看无idview@kovarov我的问题是为了证明这一点吃了这个解决方案,它不是解决您问题的确切查询。请使用
cont\u numero
代替id。非常感谢,这是我的服务,我找到了解决方案,但不是通过过程