3063单词,预计学习时间为9分钟

SQL广泛用于数据分析和数据提取易于使用,很受业界欢迎
虽然一开始编写SQL很容易,但错误率也很高
以下是人们在编写SQL查询代码时常见的五个错误。
示例很短,可能看起来很简单。但是,在处理较大的查询时,这些错误不会一目了然。这些例子中的一些是特定于AWS红移的,而另一些出现在其他的SQL数据库(Postgres、MySQL等)中。)这些示例应该在本地数据库上运行,或者可以使用SQLFiddle在线运行可以下载
示例SQL查询

设置
创建两个临时表,其中几个表有助于处理示例
销售表
该表包含带有时间戳、产品、价格等的销售条目。请注意,键列是唯一的,其他列中的值可以重复(例如,ts列)
删除表(如果存在);
CREATE TEMPLATE TABLE sales
(
key varchar(6),
ts timestamp,
product integer,
completed boolean,
price float
);插入sales
values(“sale _ 1”,“2019-11-08 00:00”,0,TRUE,1.1),
(“sale _ 2”,“2019-11-08 01:00”,0,FALSE,1.2),
(“sale _ 3”,“2019-11-08 01:00”,0,TRUE,1.3),
(“sale _ 3”)从销售中选择*;

该表包含给定日期每小时的延迟时间请注意,ts列在下表中是唯一的
丢弃表(如果存在)延迟时间;
创建临时表时延
(
ts时间戳,
延迟浮点
);
插入时延
值(“2019-11-08 00:00”,80.1),
(“2019-11-08 01:00”,100.2),
(“2019-11-08 02:00”,70.3);从每小时延迟中选择*;
1。使用相同的时间戳对
进行排序,以检索每种产品的最新销售价格:
选择价格
自(选择价格,行号()OVER(分区副产品由ts DESC订购)AS ix自销售)AS q 1
其中IX = 1;高于
的查询的问题是多个销售有相同的时间戳对同一数据连续运行该查询可能会导致不同的结果。从下图可以看出,产品0在2019-11-11-08 01:00期间分别以1.2和1.3的价格销售了两次。

修复此查询,出现下一个错误:)
2。根据条件计算平均值
计算成品的平均价格该值为(1.1+1.3+1.5+1.5)/ 4或1.35
选择平均值(价格)
从(完成时选择案例=真实,然后价格,其他0作为销售价格结束)作为第1季度;
运行查询时,该值为0.9为什么?因为这个计算:(1.1+0+1.3+0+1.5+1.5)/6是0.9查询中的错误是将0设置为不应包含的项。应该使用空值而不是0
选择平均值(价格)
从(完成时选择案例=真实价格,否则为销售的最终价格)到第1季度;
目前,输出为预期的1.35
3。计算整数列的平均值
计算包含整数的乘积列的平均值
选择平均值(产品)
来自销售;
乘积列中有3个0和3个1,估计平均值为0.5大多数数据库,如最新版本的Postgres,将返回0.5,但红移将返回0,因为它不会自动将产品列转换为浮动因此,它需要转换为浮点类型:
从sales中选择avg(product::float)
;
4。内部连接
假设汇总每天的所有销售延迟,并计算每天的平均销售价格
SELECT t2.ts::DATE,sum(t2.delay),avg(t1 . price)
from hour _ delay AS t 2
INNER JOIN sales ASt1 ON t1 . ts = T2 . ts
GROUP BY T2 . ts::DATE;
结果错了!上面的查询将小时延迟表中的延迟列乘以一个倍数,如下图所示这是因为连接是通过时间戳建立的,时间戳在时延表中是唯一的,但在销售表中是重复的

要解决此问题,请在单独的子查询中计算每个表的统计信息,然后连接总数这使得时间戳在两个表中都是唯一的
选择t1.ts,daily _ delay,avg _ price
从(选择t2.ts::DATE,sum(T2 . delay)AS DaiLy _ delay FROM hour _ delay AS T2 GROUP by 2 . ts::DATE)AS t 2
内部连接(选择ts::DATE AS ts,avg(price)AS avg _ price FROM sales GROUP by ts::DATE)AS t1 ON t1 . ts = T2 . ts;
5。在ORDER BY
中添加列显然可以弥补上述错误。将键列添加到ORDER BY中,以便可以在相同的数据上重复查询结果-快速修复
SELECT price
from(SELECT price,row _ number()OVER(PARTITION subside ORDER BY ts,key desc)AS IX from sales)AS q 1
其中IX = 1;
为什么查询结果不同于上次运行的结果?在“快速修复”过程中,键列被放置在“排序依据”中的错误位置应该在DESC声明之后,而不是之前查询现在将返回第一次销售,而不是最后一次销售。再做一次更正
SELECT产品,价格
FROM (SELECT产品,价格,行号()OVER(PARTITION subside ORDER BY ts desc,key)AS IX from sales)AS q 1
其中IX = 1;
此修复使结果可重复

这些都是SQL错误和解决方案,经常被人们踩在脚下。我不知道您是否也有同样的感觉,或者对SQL查询有其他有趣的事情?记得与小芯片分享yo ~

。我们共享256多种人工智能学习和开发产品