使用非等值自连接实现类窗口排序函数

前言

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值