Sql 在查询中,如果一行缺少数据,我希望从上一行中选择数据

Sql 在查询中,如果一行缺少数据,我希望从上一行中选择数据,sql,Sql,我有两个表:Table1有一个账号和一个描述,是静态的,包含所有现有的账户 表2包含账号、期间id、期初余额和期末余额 我已按帐号加入表格。我将使用帐号0000-1234-000作为示例。它有周期1、2、3和5的数据 我的问题很简单: SELECT t2.periodid, t1.acctnmbr, t1.description, t2.bgnblnc, t2.endblnc FROM table1 T1 LEFT JOIN Table2 T2 on t1.acctnmbr = t2.acct

我有两个表:
Table1
有一个账号和一个描述,是静态的,包含所有现有的账户

表2
包含账号、期间id、期初余额和期末余额

我已按帐号加入表格。我将使用帐号0000-1234-000作为示例。它有周期1、2、3和5的数据

我的问题很简单:

SELECT t2.periodid, t1.acctnmbr, t1.description, t2.bgnblnc, t2.endblnc
FROM table1 T1 
LEFT JOIN Table2 T2 on t1.acctnmbr = t2.acctnmbr
WHERE t1.acctnmbr = 0000-1234-000
这将返回以下内容:

1  0000-1234-000   Disbursement   256,786.00   165,784.00  
2  0000-1234-000   Disbursement   165,784.00   184,574.00  
3  0000-1234-000   Disbursement   184,574.00   376,144.00  
5  0000-1234-000   Disbursement   376,144.00   165,784.00
您可以看到缺少句点4。表2中没有为该账户输入第4期的数据。我本以为使用左连接,我至少会返回带有“null”值的帐号,但这是另一天的问题。我想要的是在我的查询中插入句点4和句点3的结果


因此,逻辑是“如果不存在,则前期余额”。如何实现这一点?

在标准SQL中,您可以构造所需的句点,使用
左join
生成行,然后使用
滞后(忽略空值)
引入所需的数据。并非所有数据库都支持此标准功能,但查询如下所示:

with t as (
      SELECT t2.periodid, t1.acctnmbr, t1.description, t2.bgnblnc, t2.endblnc
      FROM table1 T1 LEFT JOIN
           Table2 T2 
           ON t1.acctnmbr = t2.acctnmbr
      WHERE t1.acctnmbr = '0000-1234-000'
     )
select v.periodid, '0000-1234-000' as acctnmbr,
       coalesce(description, lag(description ignore nulls) over (order by v.periodid) as description,
       coalesce(bgnblnc, lag(bgnblnc ignore nulls) over (order by v.periodid) as bgnblnc,
       coalesce(endblnc, lag(endblnc ignore nulls) over (order by v.periodid) as endblnc
from (values (1), (2), (3), (4), (5)) v(periodid) left join
      t
      on t.periodid = v.periodid

这是一个典型的孤岛和缺口问题。您必须设计另一个包含所有句点的查询,而不参与派生值,如果您愿意的话,可以设计一个脚手架。通常,“stream”查询是查询中的主表,左连接是有用的数据。如果时间允许,我将提供一个例子。另外,如果你编辑你的帖子并指出你针对这个问题的数据库系统,这对其他人也会很有用。用你正在使用的数据库标记你的问题。左键将它连接到你的
periods
表,其中
periodic
是主键。或者,如果
periods
表不存在,将其左键连接到
生成序列(1,5)periods(period\u id)
。如果是博士后,请参阅此帖子