首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >近似获取最接近的行

近似获取最接近的行
EN

Stack Overflow用户
提问于 2019-03-12 18:26:39
回答 2查看 43关注 0票数 0

我有一张这样的桌子:

TableTest

代码语言:javascript
复制
Col1  Col2  Col3  Col4
 5     6     7     8
 12    6     5     6
 2     3.5   6     1

我想要找到最接近的行: 4,5.75,7.2,6人类可以找到它(第1行是答案),但是我如何编写一个查询,让计算机找到它?

EN

回答 2

Stack Overflow用户

发布于 2019-03-12 18:35:30

我会将“最接近”解释为“表值和提供的绝对差值之和最小”:

代码语言:javascript
复制
select top 1 col1,col2,col3,col4
from yourtable
order by abs(col1-4)+abs(col2-5.75)+abs(col3-7.2)+abs(col4-6) asc
票数 1
EN

Stack Overflow用户

发布于 2019-03-12 20:39:20

这将采用差异和最小的行,如果有更多相同的差异和,它将采用col1,col2,col3,col4中最大差异最小的行。我添加RowId只是为了以某种方式指向正确的行。

AbosluteDiff的col1,col2,col3,col4列不是必须的,我把它们留在这里只是为了更好地检查,如果你想选择它们:

代码语言:javascript
复制
DECLARE @table TABLE
(
    Col1 DECIMAL(10,2),
    Col2 DECIMAL(10,2),
    Col3 DECIMAL(10,2),
    Col4 DECIMAL(10,2)
);

INSERT INTO @table (Col1, Col2, Col3, Col4)
VALUES
(5, 6, 7, 8),
(12, 6, 5, 6),
(2, 3.5, 6, 1);

WITH AbsoluteDiff(RowID, Col1, Col2, Col3, Col4, Col1Diff, Col2Diff, Col3Diff, Col4Diff, DiffSum)
AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) 
    ,Col1, Col2, Col3, Col4, abs(Col1-4), abs(Col2-5.75), abs(Col3-7.2), abs(Col4-6), abs(Col1-4)+abs(Col2-5.75)+abs(Col3-7.2)+abs(Col4-6)
    FROM @table
)
SELECT TOP 1 RowID
FROM AbsoluteDiff
ORDER BY DiffSum ASC, CASE
                        WHEN Col1Diff >= Col2Diff AND Col1Diff >= Col3Diff AND Col1Diff >= Col4Diff THEN Col1Diff
                        WHEN Col2Diff >= Col1Diff AND Col2Diff >= Col3Diff AND Col2Diff >= Col4Diff THEN Col2Diff
                        WHEN Col3Diff >= Col1Diff AND Col3Diff >= Col2Diff AND Col3Diff >= Col4Diff THEN Col3Diff
                        ELSE Col4Diff
                    END ASC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55119214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档