SQL返回列表中的最大值(小于现有值)

时间:2018-11-21 18:06:04

标签: sql sql-server

目标是找到小于列表中现有值的最大值,例如:

  • ID |输入|输出
  • ID | ColA | ColB
  • A | 1 | NULL
  • B | 2 | 1
  • C | 7 | 4
  • D | 4 | 2

我现有的代码可以运行,但是在大型数据集上运行速度很慢: (复杂度为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)

1 个答案:

答案 0 :(得分:1)

使用lag()。您的代码很难遵循,但我认为您想要这样做:

select a.*, lag(input) over (partition by id order by input)
from tablea: