每對商品的退貨百分比
我有兩個目標:第一個是返回頭等艙預訂量最多的航空公司的 IATA 程式碼。我想到了這一點,但它並不完全奏效,它只是以沒有特定順序的方式返回所有航空公司:
select iata_code_airline from booked_class_airline group by class having MAX(airline_class_count)
第二個目標是提供一個列,顯示每個艙位中旅行的乘客總數的百分比。我試過:
SELECT class, count(class) as class_count, count(class) * 100.0 / (select count(*) from booked_class_airline) as class_percent FROM booked_class_airline group by class
但這只是計算類,而不是類的數量。我可以使用 airport_class 計數列,但是我不知道如何劃分每個班級。有什麼建議嗎?
為了解決您的問題,我執行了以下操作(下面的所有程式碼都可以在此處的小提琴中找到):
(說到小提琴,如果您向我們提供一個(DDL 和 DML)以及您的問題會更好 - 它消除了重複工作並提供了**-**
single source of truth
幫助我們幫助您!另外,請避免使用圖像的原因此連結中概述)。
- Q1。首先是返回頭等艙預訂量最多的航空公司的 IATA 程式碼。
這比乍一看要復雜。一種天真的方法是執行以下操作:
SELECT class, iata, MAX(cnt) FROM flight WHERE class = 'First' GROUP BY class, iata LIMIT 1;
結果:
class iata MAX(cnt) First BA 2
但是,當我們執行以下操作時會發生什麼
INSERT INTO flight VALUES ('First', 'EI', 2);
並重新執行我們的查詢?
結果一樣!!!但這是錯誤的!或者至少具有誤導性,因為我們現在有兩家航空公司(
BA
和EI
),有兩次預訂頭等艙!這證明了使用少量(或在本例中為最少)數據進行測試的危險!在這裡,我們應該做的是:
SELECT class, iata, MAX(cnt) AS c FROM flight WHERE class = 'First' GROUP BY class, iata HAVING MAX(cnt) = ( SELECT MAX(cnt) FROM flight WHERE class = 'First' );
結果:
class iata c First BA 2 First EI 2
根據您的要求,這可能(恕我直言,可能是)更好。
最後,您可能要考慮的第三種方法是使用視窗函式(v.技術連結 -這個介紹非常好) - 這裡可能有點矯枉過正,但視窗函式對於更複雜的查詢非常強大,並且會回報所花費的任何努力學習它們10次!我在這種情況下使用的是
DENSE_RANK()
(來自介紹連結)。SELECT *, DENSE_RANK() OVER (PARTITION BY class ORDER BY cnt DESC) AS dr FROM flight WHERE class = 'First' ORDER BY dr ASC;
結果:
class iata cnt dr First BA 2 1 First EI 2 1 First SN 1 2
然後,您可以包裝這是一個子查詢(參見小提琴)以提取出排名第一的航空公司。你可能會問自己為什麼要使用它?假設您的經理來找您並說,我需要預訂頭等艙航班的排名第三的航空公司 - 與“傳統” SQL 相比很棘手 - 這讓事情變得輕而易舉!
- Q.2 第二個目標是提供一個列,顯示每個艙位中旅行的乘客總數的百分比。
我已經留下了一些較早的步驟來到達這裡 - 執行這個:
SELECT class AS "Class", SUM(cnt) AS "Total", ROUND(SUM(cnt) * 1.0/(SELECT SUM(cnt) FROM flight) * 100) AS "Percentage" FROM flight GROUP BY class;
結果:
Class Total Percentage Business 4 31 Economy 4 31 First 5 38
您可能想知道為什麼在百分比計算中有一個無用的乘以 1?這是為了避免整數除法的問題 - 嘗試將其取出 - 所有百分比都降至 0!我在這裡找到了這個片段——它更優雅——儘管可能比明確的
CAST
——YMMV 更令人費解。+1 為我提供了學習經驗的問題!