场景:表中有2列,数据如下例所示。对于“ a”列的同一值,该表可能有多行。
在示例中,考虑“ a”列,“ 1”有三行,“ 2”有一行。
样本表“ t1”:
| a | b | | 1 | 1.1 | | 1 | 1.2 | | 1 | 2.2 | | 2 | 3.1 |
要求是获得以下输出:
预期查询输出:
| a | b | | 1 | 1.2 | | 2 | 3.1 |
要求:
我使用的查询:
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;
它只有一个过程调用,因此它可能运行得更快
并且请注意,“联合”子句不仅附加了两个数据集,而且还删除了重复项。删除重复项会导致在数据集之间进行其他检查,因此会导致性能问题。
在大多数情况下,最好使用不检查重复项的“全部合并”
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句