前言
在使用Hive的時候,我們經常使用窗口函數來實現對查詢內容的排序操作,其中經常使用Rank() OVER() ,DENSE_RANK() 等,但是,在mysql中,8.0以下版本並不支持窗口函數的使用,因此,爲了實現類似的效果,我們可以使用非等值自連接(真的很實用)來進行查詢。
數據準備
CREATE TABLE Products
(name VARCHAR(16) PRIMARY KEY,
price INTEGER NOT NULL);
INSERT INTO Products VALUES('蘋果', 50);
INSERT INTO Products VALUES('橘子', 100);
INSERT INTO Products VALUES('葡萄', 50);
INSERT INTO Products VALUES('西瓜', 80);
INSERT INTO Products VALUES('檸檬', 30);
INSERT INTO Products VALUES('香蕉', 50);
查詢語句
SELECT P1.name,
P1.price,
(SELECT COUNT(P2.price)
FROM Products P2
WHERE P2.price > P1.price) + 1 AS rank_1
FROM Products P1
ORDER BY rank_1;
它利用“通過遞歸集合來定義數”的思想,先定義最高價100的順序作爲no.1,然後利用100定義80的順序,然後利用100和80定義50的順序。。。以此類推,完成排序操作。
此外,這種排序方式還很有利於擴展。例如
SELECT P1.name,
P1.price,
(SELECT COUNT(DISTINCT P2.price)
FROM Products P2
WHERE P2.price > P1.price) + 1 AS rank_1
FROM Products P1
ORDER BY rank_1;
通過在count函數中增加一個去重選項,那麼存在相同位次的記錄時,就可以不跳過之後的位次,而是繼續輸出,類似DENSE_RANK函數的效果。
END!!