【SQL 经典题】

构造分区

需求:每一次titlechinese变更,都重新排序;
在这里插入图片描述

--建表
CREATE TABLE test(
	titlechinese VARCHAR(100),
	changedate VARCHAR(10)
);

-- 插入数据
INSERT INTO test VALUES('地区销售经理','2019-12-13');
INSERT INTO test VALUES('地区销售经理','2017-10-10');
INSERT INTO test VALUES('地区销售经理','2017-01-09');
INSERT INTO test VALUES('地区销售经理','2016-12-09');
INSERT INTO test VALUES('地区销售经理','2016-12-06');
INSERT INTO test VALUES('高级医学信息专员(销售主管)','2015-01-13');
INSERT INTO test VALUES('地区销售经理','2014-01-21');
INSERT INTO test VALUES('地区销售经理','2014-01-20')INSERT INTO test VALUES('高级医学信息专员','2013-12-09');

(1)获取变更的第一条记录

SELECT
	*,
	IF(titlechinese != prevtitle,1,0) rk
FROM
(
	SELECT
		*,
		LAG(titlechinese,1,'null') OVER() prevtitle
	FROM  test
	ORDER BY changedate ASC
) t

在这里插入图片描述
(2) 现在需要按照 titlechinese + 一个额外字段 才能进行分组,这个额外字段每到1变一下,到0不变

SELECT
	*,
	SUM(rk) OVER(ORDER BY rn)
FROM
(
	SELECT
		*,
		IF(titlechinese != prevtitle,1,0) rk,
		ROW_NUMBER() OVER() rn
	FROM
	(
		SELECT
			*,
			LAG(titlechinese,1,'null') OVER() prevtitle
		FROM  test
		ORDER BY changedate ASC
	) t	
) t1

在这里插入图片描述
现在可以按照titlechinese + sum() 进行分组了!

(3)分组排序,完成需求

SELECT
	titlechinese,
	changedate,
	RANK() OVER(PARTITION BY titlechinese,groupid ORDER BY rn)
FROM
(
	SELECT
		titlechinese,changedate,
		SUM(rk) OVER(ORDER BY rn) groupid,
		rn
	FROM
	(
		SELECT
			titlechinese,changedate,
			IF(titlechinese != prevtitle,1,0) rk,
			ROW_NUMBER() OVER() rn
		FROM
		(
			SELECT
				titlechinese,changedate,
				LAG(titlechinese,1,'null') OVER() prevtitle
			FROM  test
			ORDER BY changedate ASC
		) t	
	) t1
) t2
ORDER BY changedate DESC

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值