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