Sql 如何在列中找到最接近的数字?

Sql 如何在列中找到最接近的数字?,sql,azure-sql-data-warehouse,Sql,Azure Sql Data Warehouse,我有这张桌子: col_1 | col_2 | col_3 | compare ------+-------+-------+-------- 1.1 | 2.1 | 3.1 | 2 ------+-------+-------+-------- 10 | 9 | 1 | 15 我想导出一个新的列选项,指示最接近比较值的列: col_1 | col_2 | col_3 | compare | choice ------+-------+-------+----

我有这张桌子:

col_1 | col_2 | col_3 | compare
------+-------+-------+--------
 1.1  | 2.1   | 3.1   | 2
------+-------+-------+--------
 10   | 9     | 1     | 15
我想导出一个新的列选项,指示最接近比较值的列:

col_1 | col_2 | col_3 | compare | choice
------+-------+-------+---------+-------
 1.1  | 2.1   | 3.1   | 2       | col_2
------+-------+-------+---------+-------
 10   | 9     | 1     | 15      | col_1

选择是指单元格值与比较值最接近的列。

我认为最简单的方法是
apply

select t.*, v.which as choice
from t cross apply
     (select top (1) v.*
      from (values ('col_1', col_1), ('col_2', col_2), ('col_3', col_3)
           ) v(which, val)
      order by abs(v.val - t.compare)
     ) v;
如果出现连接,则返回任意最近的列

您也可以使用
case
表达式,但这会变得复杂。无
NULL
值时:

select t.*,
       (case when abs(compare - col_1) <= abs(compare - col_3) and
                  abs(compare - col_1) <= abs(compare - col_3)
             then 'col_1'
             when abs(compare - col_2) <= abs(compare - col_3)
             then 'col_2'
             else 'col_3'
         end) as choice
from t;
选择t.*,
(abs时的情况(比较-列1)