目标是找到小于列表中现有值的最大值,例如:
我现有的代码可以运行,但是在大型数据集上运行速度很慢: (复杂度为NlogN,希望解决方案的复杂度应为N或更低。我尝试cte的速度仍然很慢。)
SELECT TMain.Id, TMain.ColA As Input, T1.ColA As Output,
FROM TABLEA As TMain
LEFT JOIN TABLEA T1
ON T1.Id = TMain.Id
AND T1.ColA = (SELECT Min (T2.ColA)
FROM TABLEA T2
WHERE T2.Id = T1.Id
AND T2.ColA > TMain.ColA)
答案 0 :(得分:1)
使用lag()
。您的代码很难遵循,但我认为您想要这样做:
select a.*, lag(input) over (partition by id order by input)
from tablea: