MS SQL Server 2008/2012获取任意两个值之间的最小差异

时间:2012-09-14 15:04:42

标签: tsql sql-server-2012

给定一个包含单个money列的表,如何使用TSQL计算该表中任意两个值之间的最小差异?我正在寻找性能优化的解决方案,它可以处理数百万行。

1 个答案:

答案 0 :(得分:2)

对于SQL Server 2012,您可以使用

;WITH CTE
     AS (SELECT YourColumn - Lag(YourColumn) OVER (ORDER BY YourColumn) AS Diff
         FROM   YourTable)
SELECT 
      Min(Diff) AS MinDiff
FROM   CTE 

这是通过对表的一次扫描来实现的(理想情况下,您将在YourColumn上有一个索引以避免排序,并且该单个列上的窄索引会减少IO)。

我想不出一个很好的方法来使它短路,所以如果它找到最小可能的零差异,那么不到一次扫描。将MIN(CASE WHEN Diff = 0 THEN 1/0 END)添加到SELECT列表并将除以零误差作为发现零的信号可能会有效但我不能真正推荐这种方法......