gpt4 book ai didi

sql - 寻找 SQL 中的性能改进

转载 作者:行者123 更新时间:2023-12-04 03:37:29 28 4
gpt4 key购买 nike

场景:表中有 2 列,数据如下例所示。对于“a”列的相同值,该表可能有多个行。

在示例中,考虑到“a”列,“1”有三行,“2”有一行。

示例表“t1”:

|a|b  ||1|1.1||1|1.2||1|2.2||2|3.1|

Requirement is to get following output:

Expected Query output:

|a|b  ||1|1.2||2|3.1|

Requirement:

  • Get the row if there is only one row for a given value for column 'a'.
  • If there are multiple rows for the same value for column 'a' and for all rows, FLOOR(b) == a, then get MIN(a) and MAX(b)
  • If there are multiple rows for column 'a' and for all rows, there is 1 row of column 'b' for whichFLOOR(b) > a, then ignore that row. from the remaining rows, get MIN(a) and MAX(b)

Query I used:

select distinct min(a) over(partition by table1.a) as a,
min(b) over(partition by table1.a) as b
from (
SELECT distinct Min(table2.a) OVER (PARTITION BY table2.a) AS a,
Max(table2.b) OVER (PARTITION BY table2.a) AS b
FROM t1 table2
union
SELECT distinct Min(table3.a) OVER (PARTITION BY table3.a) AS a,
Max(table3.b) OVER (PARTITION BY table3.a) AS b
FROM t1 table3
where table3.a = FLOOR(table3.b)
) table1;

此查询正在运行,我得到了所需的输出。通过从上面的脚本中删除联合和额外的选择来寻找改进的输入。

注意:t1 不是一个表,但在我的例子中它是一个过程调用,它还返回其他列。如果可以避免对过程的额外调用,将会有所帮助。

最佳答案

这就是我获取您需要的数据的方式。

select t1.a, max(t1.b) 
from (select a, b, count(1) over(partition by t1.a) cnt from t1) t1
where t1.a = floor(t1.b) or cnt = 1
group by t1.a ,cnt;

它只有一个过程调用,因此它可能运行得更快

请注意,“union”子句不仅附加了两个数据集,而且还删除了重复项。删除重复项会导致数据集之间进行额外检查,因此会导致性能问题。

在大多数情况下最好使用不检查重复项的“union all”

关于sql - 寻找 SQL 中的性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66633347/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com