我有以下示例MyTable,它是根据原始数据集进行分组的。
我想找到";plus_one";值是最接近"0"的匹配(上面的第一个结果);值";列中的给定";dept";。这需要在";return_dt";柱
例如,在第一行中;plus_one";列中的";衣服;dept最接近1.36667;值";列中的相应日期(6/19/20),因此第一行需要返回";return_dt";同一部门的列
我熟悉窗口函数,并使用ORDER BY abs()来查找最接近的匹配项。我很难把它们放在一起在一个表中找到索引日期。
end_dt | dept | 值plus_onereturn_dt | ||
---|---|---|---|---|
2020年6月30日0:00 | 衣服 | 0.2 | 1.2 | 2020年6月19日|
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.3933331.3933332020年6月17日 | ||
2020年6月26日0:00 | 衣服 | 0.5733331.5733332020年6月17日 | ||
2020年6月25日0:00 | 衣服 | 0.7266671.7266672020年6月16日 | ||
2020年6月24日0:00 | 衣服 | 0.8533331.8533332020年6月15日 | ||
2020年6月23日0:00 | 衣服 | 1.02 | 2.02 | 2020年6月12日|
2020年6月22日0:00 | 衣服 | 1.1666672.1666672020年6月12日 | ||
2020年6月21日0:00 | 衣服 | <1.16667><2.16667>|||
2020年6月20日0:00 | 衣服 | 1.1666672.166667|||
2020年6月19日0:00 | 衣服 | 1.366667 | 2.366667||
2020年6月18日0:00 | 衣服 | 1.5 | 2.5 | |
2020年6月17日0:00 | 衣服 | <1.713333><2.713333>|||
2020年6月16日0:00 | 衣服 | 1.84 | 2.84 | |
2020年6月15日0:00 | 衣服 | <1.986667><2.986667>|||
2020年6月14日0:00 | 衣服 | <1.986667><2.986667>|||
2020年6月13日0:00 | 衣服 | <1.986667><2.986667>|||
2020年6月12日0:00 | 衣服 | 2.24 | 3.24||
… | <td…> | |||
2020年6月30日0:00 | 玩具 | 0.2 | 1.2 | 2020年6月19日|
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 | 玩具 | 0.7266671.7266672020年6月16日 | ||
2020年6月24日0:00 | 玩具 | 0.8533331.8533332020年6月15日 | ||
2020年6月23日0:00 | 玩具 | 1.02 | 2.02 | 2020年6月12日 |
2020年6月22日0:00 | 玩具 | 1.1666672.1666672020年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 | 玩具 | <1.5><2.5>|||
2020年6月17日0:00 | 玩具 | <1.713333><2.713333>|||
2020年6月16日0:00 | 玩具 | 1.84 | 2.84 | |
2020年6月15日0:00 | 玩具 | <1.986667><2.986667>|||
2020年6月14日0:00 | 玩具 | 1.986667 | <2.986667>||
2020年6月13日0:00 | 玩具 | 1.986667 | <2.986667>||
2020年6月12日0:00 | 玩具 | 2.24 | 3.24||
… | <td…> | |||
2020年6月30日0:00 | 游戏 | 0.2 | 1.2 | 2020年6月19日|
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.5733331.5733332020年6月17日 | ||
2020年6月25日0:00 | 游戏 | 0.7266671.7266672020年6月16日 | ||
2020年6月24日0:00 | 游戏 | 0.8533331.8533332020年6月15日 | ||
2020年6月23日0:00 | 游戏 | 1.02 | 2.02 | 2020年12月6日|
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 | 游戏 | <1.713333><2.713333>|||
2020年6月16日0:00 | 游戏 | 1.84 | 2.84 | |
2020年6月15日0:00 | 游戏 | <1.986667><2.986667>|||
2020年6月14日0:00 | 游戏 | <1.986667><2.986667>|||
2020年6月13日0:00 | 游戏 | <1.986667><2.986667>|||
2020年6月12日0:00 | 游戏 | 2.24 | 3.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;