91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

5個編寫SQL查詢時常出現的錯誤分別是什么

發布時間:2021-11-29 11:30:57 來源:億速云 閱讀:162 作者:柒染 欄目:數據庫

這篇文章將為大家詳細講解有關5個編寫SQL查詢時常出現的錯誤分別是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

SQL被廣泛應用于數據分析和數據提取。易上手,受到業內人士的一致好評

盡管剛開始編寫SQL相當容易,但是出錯率也是相當的高。

下面是小芯整理的,在編寫SQL查詢代碼時大家經常犯的5個錯誤。

示例很短,可能看起來很簡單。但是,在處理更大的查詢時,這些錯誤可就不會一目了然了。其中一些示例是特定于AWS  Redshift的,而另一些則會出現在其他SQL數據庫(Postgres、MySQL等)。這些示例應該在本地數據庫上運行,或者可以使用SQLFiddle在線運行。

示例SQL查詢可下載。

設定

創建兩個臨時表,其中有幾個條目有助于處理示例。

Sales表

該表包含帶有時間戳、產品、價格等的銷售條目。請注意,key列是唯一的,其他列中的值可以重復(例如ts列)。

DROP TABLE IF EXISTSsales;  CREATE TEMPORARY TABLE sales  (  key varchar(6),  ts timestamp,  product integer,  completed boolean,  price float  );INSERT INTO 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_4', '2019-11-08 01:00', 1, FALSE,1.4),  ('sale_5', '2019-11-08 02:00', 1, TRUE,1.5),  ('sale_6', '2019-11-08 02:00', 1, TRUE,1.5);SELECT * FROM sales;
5個編寫SQL查詢時常出現的錯誤分別是什么

Hourly delay表

該表包含某一天每小時的延遲時間。請注意,ts列在下表中是唯一的。

DROP TABLE IF EXISTShourly_delay;  CREATE TEMPORARY TABLE hourly_delay  (  ts timestamp,  delay float  );  INSERT INTO hourly_delay  VALUES ('2019-11-08 00:00', 80.1),  ('2019-11-08 01:00', 100.2),  ('2019-11-08 02:00', 70.3);SELECT* FROM hourly_delay;
5個編寫SQL查詢時常出現的錯誤分別是什么

1.按相同時間戳排序

檢索每種產品最近一次的售價:

SELECT price  FROM (SELECT price, row_number() OVER (PARTITION BYproduct ORDER BY ts DESC) AS ix FROM sales) ASq1  WHERE ix = 1;
5個編寫SQL查詢時常出現的錯誤分別是什么

以上查詢的問題是多個銷售具有相同的時間戳。此查詢在相同數據上的連續運行可能得出不同的結果。下圖可見,產品0在2019-11-11-08  01:00有兩次銷售,價格分別為1.2和1.3。

5個編寫SQL查詢時常出現的錯誤分別是什么

用下一個錯誤修復這個查詢:)

2. 根據條件計算平均值

計算完成銷售的產品的平均價格。值是(1.1 + 1.3 + 1.5 + 1.5)/ 4,即1.35。

SELECT avg(price)  FROM (SELECT CASE WHEN completed = TRUETHEN price else 0 END AS price FROM sales) ASq1;

當運行查詢時,值為0.9。為什么?因為發生了這一計算:(1.1+0+1.3+0+1.5+1.5)/6是0.9。查詢中的錯誤是,將0設置為不應包含的項。應使用NULL而不是0。

SELECT avg(price)  FROM (SELECT CASE WHEN completed = TRUETHEN price else NULL END AS price FROMsales) AS q1;

當前,輸出和預計一樣是1.35。

3.計算整數列的平均值

計算含有整數的product列的平均值。

SELECT avg(product)  FROM sales;

Product列中有3個0和3個1,預估平均值為0.5。大多數數據庫(例如最新版本的Postgres)將返回0.5,但是Redshift將返回0,因為它不會自動將product列強制轉換為float。因此需要將其強制轉換為float類型:

SELECT avg(product::FLOAT)  FROM sales;

4. 內連接

假設要對每天的所有銷售延遲進行匯總,并計算每天的平均銷售價格。

SELECT t2.ts::DATE, sum(t2.delay),avg(t1.price)  FROM hourly_delay AS t2  INNER JOIN sales ASt1 ON t1.ts = t2.ts  GROUP BY t2.ts::DATE;
5個編寫SQL查詢時常出現的錯誤分別是什么

結果是錯誤的!以上查詢將hourly_delay表中的delay列乘以倍數,如下圖所示。這是因為按時間戳連接,該時間戳在hourly_delay表中是唯一的,但在sales表中會重復。

5個編寫SQL查詢時常出現的錯誤分別是什么

為了修復這個問題,要在一個單獨的子查詢中為每個表計算統計信息,然后連接匯總。這使得時間戳在兩個表中都是唯一的。

SELECT t1.ts, daily_delay, avg_price  FROM (SELECT t2.ts::DATE, sum(t2.delay) ASdaily_delay FROM hourly_delay AS t2 GROUP BYt2.ts::DATE) AS t2  INNER JOIN (SELECTts::DATE AS ts, avg(price) AS avg_price FROM sales GROUPBY ts::DATE) AS t1 ON t1.ts = t2.ts;
5個編寫SQL查詢時常出現的錯誤分別是什么

5.將列添加到ORDER BY

對上述錯誤的補救是顯而易見的。將key列添加到ORDER BY,這樣一來,查詢結果就可以在相同數據上重復出現——快速修復。

SELECT price  FROM (SELECT price, row_number() OVER (PARTITION BYproduct ORDER BY ts, key DESC) AS ix FROMsales) AS q1  WHERE ix = 1;
5個編寫SQL查詢時常出現的錯誤分別是什么

為什么查詢結果不同于上一次運行?在進行“快速修復”時,key列被放在了ORDER  BY中的錯誤位置。它應該在DESC語句之后,而不是之前。查詢現在將返回第一筆銷售,而不是最后一筆銷售。再進行一次修正。

SELECT product, price  FROM (SELECT product, price, row_number() OVER (PARTITION BYproduct ORDER BY ts DESC, key) AS ix FROMsales) AS q1  WHERE ix = 1;
5個編寫SQL查詢時常出現的錯誤分別是什么

本次修復使結果可重復。

關于5個編寫SQL查詢時常出現的錯誤分別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sql
AI

丰顺县| 新密市| 突泉县| 新平| 轮台县| 沙湾县| 洛扎县| 新兴县| 彩票| 夏津县| 酒泉市| 福建省| 台南市| 常山县| 罗定市| 顺义区| 老河口市| 于都县| 上思县| 南宁市| 三原县| 陈巴尔虎旗| 揭阳市| 即墨市| 姜堰市| 河东区| 乳源| 乌鲁木齐县| 张家口市| 永泰县| 资讯| 渭南市| 吉水县| 抚松县| 乃东县| 孝感市| 河间市| 昌都县| 永吉县| 崇左市| 五指山市|