我有一张这样的桌子:
TableTest
Col1 Col2 Col3 Col4
5 6 7 8
12 6 5 6
2 3.5 6 1我想要找到最接近的行: 4,5.75,7.2,6人类可以找到它(第1行是答案),但是我如何编写一个查询,让计算机找到它?
发布于 2019-03-12 18:35:30
我会将“最接近”解释为“表值和提供的绝对差值之和最小”:
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发布于 2019-03-12 20:39:20
这将采用差异和最小的行,如果有更多相同的差异和,它将采用col1,col2,col3,col4中最大差异最小的行。我添加RowId只是为了以某种方式指向正确的行。
AbosluteDiff的col1,col2,col3,col4列不是必须的,我把它们留在这里只是为了更好地检查,如果你想选择它们:
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 ASChttps://stackoverflow.com/questions/55119214
复制相似问题