【问题标题】:Can you join two tables to get the next row你能加入两张桌子以获得下一行吗
【发布时间】:2019-06-05 17:52:00
【问题描述】:

尝试编写一个查询,该查询将验证从一系列交易中得出的值。

表 A 包含列 Code, Date, Value,表 B 包含 Code, Date, Value。

两个表都包含相同代码的多个实例。

我想要实现的是从表 A 中获取每一行,并将表 B 中具有相同库存项目的行加入到其中,并且是小于表 A 日期的第一个日期。

例如

表 A

OC001, 2019-01-01, £10

表 B 有

OC001, 2018-10-15, £6
OC001, 2018-11-30, £8
OC001, 2019-01-02, £11

预期结果是

OC001, 2019-01-01, £10, OC001, 2018-11-30, £8

因为 2018-11-30 最接近 2019-01-01 并且 OC001 = OC001

尝试了不同的连接方法,但达到了我能构建的极限。

SELECT
  r.Code,
  cc.StockCode,
  r.Date,
  cc.InvDate
FROM tableA as r
JOIN tableB as cc ON r.Code = cc.StockCode AND r.Date >= cc.InvDate
ORDER BY r.Code, r.Date, cc.InvDate

该查询在大部分情况下都有效,但是当表 B 中有多个匹配结果时,它会重复结果。

【问题讨论】:

  • 欢迎来到stackoverflow。请花一分钟时间获取tour,尤其是How to Ask。样本数据最好以DDL + DML 的形式提供。请edit您的问题包括它,您当前的尝试和您想要的结果。更多详情,read this.

标签: tsql join


【解决方案1】:

您将在所有具有相同代码和相同或更大日期的条目上加入一个条目。在这种情况下,您可能总是会得到一个很大的结果集,具体取决于插入数据库中的数据数量。

要获取表中包含的下一个事务,您需要聚合数据并以最低的 InvDate 继续:

SELECT r.Code,r.Date,MIN(cc.InvDate) 
FROM tableA as r 
JOIN table B as cc ON r.Code = cc.Code
WHERE r.Date >= cc.InvDate 
GROUP BY r.Code,r.Date

首先,表 a 中具有相同代码的所有条目将加入表 b 条目,然后按必须大于等于的日期过滤。因为可能会有一个以上的条目与此条件匹配,所以您只需要获取与表 A 条目相比下一个具有 Min(InvDate) 的条目。需要 Group By 是因为 Min 是一个 Aggregate 函数,因此您需要对要选择的所有其他属性进行分组。 (如果他们有可能存在具有相同日期的条目,请添加 Min(ID) 所以您只需将第一个添加到数据库中)

使用值选择它:

SELECT r.Code,r.Date,r.Value,MIN(cc.InvDate),cc.Value
FROM tableA as r 
JOIN table B as cc ON r.Code = cc.Code
WHERE r.Date >= cc.InvDate 
GROUP BY r.Code,r.Date,r.Value,cc.Value

认为这应该做你的事。使用自己的数据库表对其进行了测试,但使用了相同的方法。

【讨论】:

    【解决方案2】:

    我肯定会看看 LAG 和 LEAD 函数

    http://www.sqltutorial.org/sql-window-functions/sql-lag/

    SQL LAG() 是一个窗口函数,它提供对某一行的访问 当前行之前的指定物理偏移量。

    换句话说,通过使用 LAG() 函数,从当前行开始,您 可以访问前一行的数据,也可以从第二行之前的 当前行,或者从当前行之前的第三行开始,以此类推。

    LAG() 函数对于计算差异非常有用 在当前行和上一行之间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多