【问题标题】:SQlite define column based on closest difference from two tables (vlookup)SQlite 根据两个表的最接近差异定义列(vlookup)
【发布时间】:2014-01-21 23:40:29
【问题描述】:

我有两个表{示例数据 - 表 A 有几百行,表 B 有几千行}。我想用 B1 列和 A2 列之间的最小绝对差填充 B2 列 - 对应于 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) 风格的问题。

【问题讨论】:

    标签: sqlite join where-clause min vlookup


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多