如何正确设计 SQL 查询以实现最优的行输出

Posted

技术标签:

【中文标题】如何正确设计 SQL 查询以实现最优的行输出【英文标题】:How to properly design of SQL query to achieve most optimal row output 【发布时间】:2019-11-20 07:12:11 【问题描述】:

如何正确设计 SQL 查询代码以实现最优的行输出:

从表中选择(前 3 个)C1 ......(对于给定的输入 c2 到 c9)

假设有一个表有 9 列(数据是百分比值)

想象一下表格有数百万行。

     C1   C2   C3   C4   C5   C6   C7   C8   C9
     ==========================================
     0.1  0.9  0.4  0.7  0.7  0.3  0.5  0.8  0.9  R1
     0.6  0.7  0.3  0.5  0.8  0.9  0.1  0.9  0.4  R2
     0.1  0.9  0.4  0.7  0.7  0.3  0.5  0.8  0.9  R3
     0.1  0.7  0.3  0.5  0.8  0.9  0.3  0.5  0.8  R4
     0.7  0.7  0.9  0.1  0.9  0.4  0.2  0.2  0.2  R5
     0.7  0.7  0.3  0.5  0.8  0.9  0.4  0.7  0.2  R6

结果将是前 3 个 C1 值,其中每列值的绝对差之和对于 C2... 到 C9 的输入最小。

例如,如果输入是 C2=0.7, C3=0.3, C4=0.6, C5=0.8 C6=0.9 C7=0.3 C8=0.9 C9=0.2 那么

SQL查询返回的前3个C1值应该是:

     Result1 is 0.7 (as result was 0.4 from R6)
     Result2 is 0.6 (as result was 0.5 from R2)
     Result3 is 0.7 (as result was 2.5 from R5) 

计算解释如下:

           C2=0.7    C3=0.3    C4=0.6    C5=0.8    C6=0.9    C7=0.3    C8=0.9    C9=0.2
     R6 =  (0.7-0.7)+(0.3-0.3)+(0.6-0.5)+(0.8-0.8)+(0.9-0.9)+(0.3-0.4)+(0.9-0.7)+(0.2-0.2)
     absolute  0    +   0     +   0.1   +   0     +   0     +   0.1     +   0.2 +   0
     result = 0.4


     R5 =  (0.7-0.7)+(0.3-0.9)+(0.6-0.1)+(0.8-0.9)+(0.9-0.4)+(0.3-0.2)+(0.9-0.2)+(0.2-0.2)
     absolute  0.0  +   0.6   +   0.5   +   0.1   +   0.5   +   0.1   +   0.7   +   0.0
     result = 2.5

     R2 =  (0.7-0.7)+(0.3-0.3)+(0.6-0.5)+(0.8-0.8)+(0.9-0.9)+(0.3-0.1)+(0.9-0.9)+(0.2-0.4)
     absolute  0.0  +   0.0   +   0.1   +   0.0   +   0.0   +   0.2   +   0.0   +   0.2
     result = 0.5

【问题讨论】:

mysql 开始用于测试,但以后可能会更改为 ms sql 【参考方案1】:

这应该为您提供按公式升序排列的 C1 值:

SELECT C1
FROM PERCENTAGES
ORDER BY ABS(C2 - 0.7) + ABS(C3 - 0.3) + ABS(C4 - 0.6) + ABS(C5 - 0.8) + 
         ABS(C6 - 0.9) + ABS(C7 - 0.3) + ABS(C8 - 0.9) + ABS(C9 - 0.2);

使用 Oracle 测试...但它是可以在任何地方工作的普通 SQL。 要获得前 3 个值,您必须应用特定于 DB 的子句。

对于 MySQL,这应该很容易。只需在查询中添加 LIMIT 3

我建议用变量替换常量输入,并使用准备好的语句来实际运行查询。但这是另一个问题的主题。

【讨论】:

以上是关于如何正确设计 SQL 查询以实现最优的行输出的主要内容,如果未能解决你的问题,请参考以下文章

如何实现子查询以选择与三个主题中的两个主题匹配的行?

SQL语句优化系列二(编写最优的SQL语句)

动态规划(上):如何实现基于编辑距离的查询推荐?

一条SQL在MySql中如何查询

技术图文:如何利用C# 实现 Prim 最小生成树算法?

如何在 PyTorch 中高效实现非全连接线性层?