使用非等值自連接實現類窗口排序函數

前言

在使用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!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章