SQlite根据与两个表的最近差异定义列(vlookup)

时间:2014-01-20 20:39:09

标签: sqlite join where-clause min vlookup

我有两个表{示例数据 - 表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)样式问题。

1 个答案:

答案 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))