如果我理解正确,您可以使用复杂的case 表达式以及least() 和greatest():
select t.*,
nullif( least(case when '2020-01-01' < date then datediff(day, '2020-01-01', date) else 999999 end,
case when '2020-01-05' < date then datediff(day, '2020-01-05', date) else 999999 end,
case when '2020-05-10' < date then datediff(day, '2020-05-10', date) else 999999 end
), 999999
) as prev_special,
nullif( least(case when '2020-01-01' > date then datediff(day, date, '2020-01-01') else 999999 end,
case when '2020-01-05' > date then datediff(day, date, '2020-01-05') else 999999 end,
case when '2020-05-10' > date then datediff(day, date, '2020-05-10') else 999999 end
), 999999
) as next_special
from t;
我认为这在几乎任何其他数据库中都更容易表达——因为它们支持 SELECT 子句中的相关标量子查询。
编辑:
如果您在单独的表中有值,并且在原始表中有唯一的 id,则可以使用:
select t.date, t.col1,
min(case when d.date < t.date then datediff(day, d.date, t.date end) as prev_special,
min(case when d.date > t.date then datediff(day, t.date, d.date end) as next_special
from t cross join
dates d
group by t.date, t.col1;
更容易表达。性能更差。