尝试编写一个查询,该查询将验证从一系列事务中删除的值。
表A包含列Code, Date, Value
,表B包含Code, Date, Value
。
两个表都包含相同代码的多个实例。
我想要实现的是从表A中获取每一行,并将表B中具有相同库存项目的行连接到该行,并且这是第一个小于表A日期的日期。 / p>
例如
表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中有多个匹配结果时,它将重复结果。
答案 0 :(得分:0)
您要在具有相同代码和等于或大于日期的所有条目上加入一个条目。在这种情况下,根据插入到数据库中的数据数量,您可能会总是得到很大的结果集。
要获取表中包含的下一个事务,您需要汇总数据并以最低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的条目,然后按必须等于的日期过滤。因为可能剩下一个以上的条目与该条件匹配,所以您只需要使用Min(InvDate)来获得一个与表A条目相比是下一个的条目。需要分组依据是因为Min是一个聚合函数,因此您需要对要选择的所有其他属性进行分组。 (以防万一有可能存在相同日期的条目添加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
认为这应该可以解决您的问题。使用自己的数据库表对其进行了测试,但是使用了相同的方法。
答案 1 :(得分:0)
我肯定会看一下LAG
和LEAD
函数
http://www.sqltutorial.org/sql-window-functions/sql-lag/
SQL LAG()是一个窗口函数,可提供对位于 指定的物理偏移量,位于当前行之前。
换句话说,通过使用LAG()函数,从当前行开始, 可以访问上一行或第二行之前的数据 当前行,或者从当前行之前的第三行开始,依此类推。
LAG()函数对于计算差异非常有用 在当前行和上一行之间。