我有两个表{示例数据 - 表A有几百行,表B有几千行}。我想填充列B2,列B1和列A2之间的最小绝对差值 - 对应于列A1。 ......或者......设置B2 = A1,其中abs(B1-A2)最接近零。
所以在我的表格下面第一行B1 - A2 = 1.6 - 1.4 = 0.2,这是最小的差异,对应于A1中的0(接下来的两行是1和2,尽管这种巧合是由...我缺乏创造力而不是实际的桌面结构。
表A
A1 A2
0 1.4
1 2.6
2 4.3
表B
B1 B2
1.6 []
2.7 []
4.4 []
或B2 = A1,其中abs(B1-A2)最接近零。我对如何使用SQLite定义它感到茫然。我已经搜索了SO但是没有发现这个问题足够接近我的微薄的SQLite技能来跳跃。我见过的最近的是SQLite - getting closest value,但这是一个表,只有一个选择而不是更新。
我知道大多数人更愿意我提供一个答案作为起点,但他们要么完全失败,要么给我一个关于尝试使用聚合函数(min)的错误,所以我认为它不会对问题有帮助(但如果你很好奇,我已经遗憾地花了2个小时)。所以我解决了这个问题:SQLite有没有办法执行此操作?非常感谢任何帮助!
B2 = A1其中abs(B1-A2)最接近零。实际上,这是一个SQLite vlookup(Excel)样式问题。
答案 0 :(得分:1)
对于名为X
的固定B1值,此查询将计算每条A记录的差异:
SELECT *,
abs(X - A2)
FROM A
要获得最小值,我们可以使用MIN,但这只会计算差异本身。 要从同一记录中获取其他值,最好使用ORDER BY,这样,返回的第一条记录是差异最小的记录:
SELECT A1,
A2,
abs(X - A2)
FROM A
ORDER BY 3
使用LIMIT,只返回第一条记录:
SELECT A1,
A2,
abs(X - A2)
FROM A
ORDER BY 3
LIMIT 1
现在我们只想要A1
值,所以我们围绕这个包装另一个查询:
SELECT A1
FROM (SELECT A1,
abs(X - A2)
FROM A
ORDER BY 2
LIMIT 1)
现在我们可以将整个查询用作UPDATE的相关子查询,其中X
现在是当前记录的B1
值:
UPDATE B
SET B2 = (SELECT A1
FROM (SELECT A1,
abs(B1 - A2)
FROM A
ORDER BY 2
LIMIT 1))