SQL:如何找到从一列到下一列最匹配的索引日期



我有以下示例MyTable,它是根据原始数据集进行分组的。

我想找到";plus_one";值是最接近"0"的匹配(上面的第一个结果);值";列中的给定";dept";。这需要在";return_dt";柱

例如,在第一行中;plus_one";列中的";衣服;dept最接近1.36667;值";列中的相应日期(6/19/20),因此第一行需要返回";return_dt";同一部门的列

我熟悉窗口函数,并使用ORDER BY abs()来查找最接近的匹配项。我很难把它们放在一起在一个表中找到索引日期。

值plus_one2020年6月19日0.3933331.3933330.5733331.5733330.7266671.7266670.8533331.8533332020年6月12日1.1666672.166667<1.16667><2.16667>1.1666672.1666672.366667<1.713333><2.713333><1.986667><2.986667><1.986667><2.986667><1.986667><2.986667>3.242020年6月19日0.7266671.7266670.8533331.8533331.1666672.166667<1.5><2.5><1.713333><2.713333><1.986667><2.986667><2.986667><2.986667>3.242020年6月19日0.5733331.5733330.7266671.7266670.8533331.8533332020年12月6日<1.713333><2.713333><1.986667><2.986667><1.986667><2.986667><1.986667><2.986667>3.24
end_dt deptreturn_dt
2020年6月30日0:00 衣服 0.2 1.2
2020年6月29日0:00 衣服 0.393333 1.393333 2020年6月18日
2020年6月28日0:00 衣服 0.393333 1.393333 2020年6月18日
2020年6月27日0:00 衣服2020年6月17日
2020年6月26日0:00 衣服2020年6月17日
2020年6月25日0:00 衣服2020年6月16日
2020年6月24日0:00 衣服2020年6月15日
2020年6月23日0:00 衣服 1.02 2.02
2020年6月22日0:00 衣服2020年6月12日
2020年6月21日0:00 衣服
2020年6月20日0:00 衣服
2020年6月19日0:00 衣服 1.366667
2020年6月18日0:00 衣服 1.5 2.5
2020年6月17日0:00 衣服
2020年6月16日0:00 衣服 1.84 2.84
2020年6月15日0:00 衣服
2020年6月14日0:00 衣服
2020年6月13日0:00 衣服
2020年6月12日0:00 衣服 2.24
<td…>
2020年6月30日0:00 玩具 0.2 1.2
2020年6月29日0:00 玩具 0.393333 1.393333 2020年6月18日
2020年6月28日0:00 玩具 0.393333 1.393333 2020年6月18日
2020年6月27日0:00 玩具 0.393333 1.393333 2020年6月17日
2020年6月26日0:00 玩具 0.573333 1.573333 2020年6月17日
2020年6月25日0:00 玩具2020年6月16日
2020年6月24日0:00 玩具2020年6月15日
2020年6月23日0:00 玩具 1.02 2.02 2020年6月12日
2020年6月22日0:00 玩具2020年6月12日
2020年6月21日0:00 玩具 1.16667 2.16667
2020年6月20日0:00 玩具 1.16667 2.16667
2020年6月19日0:00 玩具 1.3666667 2.3666667
2020年6月18日0:00 玩具
2020年6月17日0:00 玩具
2020年6月16日0:00 玩具 1.84 2.84
2020年6月15日0:00 玩具
2020年6月14日0:00 玩具 1.986667
2020年6月13日0:00 玩具 1.986667
2020年6月12日0:00 玩具 2.24
<td…>
2020年6月30日0:00 游戏 0.2 1.2
2020年6月29日0:00 游戏 0.393333 1.393333 2020年6月18日
2020年6月28日0:00 游戏 0.393333 1.393333 2020年6月18日
2020年6月27日0:00 游戏 0.393333 1.393333 2020年6月17日
2020年6月26日0:00 游戏2020年6月17日
2020年6月25日0:00 游戏2020年6月16日
2020年6月24日0:00 游戏2020年6月15日
2020年6月23日0:00 游戏 1.02 2.02
2020年6月22日0:00 游戏 1.166667 2.166667 2020年6月12日
2020年6月21日0:00 游戏 1.166667 2.166667
2020年6月20日0:00 游戏 1.166667 2.166667
2020年6月19日0:00 游戏 1.366667 2.366667
2020年6月18日0:00 游戏 1.5 2.5
2020年6月17日0:00 游戏
2020年6月16日0:00 游戏 1.84 2.84
2020年6月15日0:00 游戏
2020年6月14日0:00 游戏
2020年6月13日0:00 游戏
2020年6月12日0:00 游戏 2.24
<td…>

横向连接或相关子查询似乎是最简单的方法:

select t.*,
(select t2.end_dt
from t t2
where t2.dept = t.dept and
t2.value > t.plus_one
order by t2.value
limit 1
) as return_dt
from t;

在没有相关子查询的情况下进行编写是相当痛苦的(而且效率低下)。但是

select t.*
from (select t.end_dt, t.dept, t.value, t.plus_one,
tnext.end_dt as return_dt,
row_number() over (partition by t.end_dt, t.dept, t.value, t.plus_one order by tnext.value asc) as seqnum
from t left join
t tnext
on tnext.dept = t.dept and
tnext.value > t.plus_one
) t
where seqnum = 1;

最新更新