如何正确设计 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 查询以实现最优的行输出的主要内容,如果未能解决你的问题,请参考以下文章