MySQL分组聚类partition关键字的替代方法

分组聚合,就是先分组再排序,可以的话顺手标个排名;如果不想分组也可以排名;如果不想分组同时再去重排名也可以

ROW_NUMBER() OVER(
    [PARTITION BY column_1, column_2,…]
    [ORDER BY column_3,column_4,…]
)

Oracle和SQL server的关键字是over partition by

mysql的无关键字row_number() over (partition by col1 order by col2),表示根据col1分组,在分组内部根据col2排序

Oracle和sqlserver

最终效果:

Image

例子:

复制代码
– 建表

USE db_03;
DROP TABLE IF EXISTS employee;
create table employee (empid int ,deptid int ,salary decimal(10,2));
insert into employee values(1,10,5500.00);
insert into employee values(2,10,4500.00);
insert into employee values(3,20,1900.00);
insert into employee values(4,20,4800.00);
insert into employee values(5,40,6500.00);
insert into employee values(6,40,14500.00);
insert into employee values(7,40,44500.00);
insert into employee values(8,50,6500.00);
insert into employee values(9,50,7500.00);

SELECT * FROM employee;
SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

结果:
如果不要分组,就仅仅order by 的话
需求:给username加上唯一标示id

背景:需要一个纬度表,里面有仅仅username的唯一标示,因为hive中不存在自增id

select distinct 
    price,
    row_number() over (order by price)
from
    products
order by 
    price;

复制代码
price | row_number
---------±-----------
300.00 | 1
300.00 | 2
400.00 | 3
500.00 | 4
600.00 | 5
600.00 | 6
700.00 | 7
800.00 | 8
800.00 | 9
900.00 | 10
1100.00 | 11
复制代码
需求同上,如果需要去重的话(distinct)

with prices as (
    select distinct
        price
    from 
        products
)
select price,row_numer()over(order by price) from prices;

price | row_number
---------±-----------
300.00 | 1
400.00 | 2
500.00 | 3
600.00 | 4
700.00 | 5
800.00 | 6
900.00 | 7
1100.00 | 8
mysql因为不能使用这个关键字,所以配合其他关键字使用
预期效果

select deptid,salary
from employee a
where 2 > (
select count(1)
from employee b
where a.salary<b.salary and a.deptid=b.deptid
)
order by a.deptid,a.salary desc;

但是有弊端,如果最大值有多个,那么就会出现多个最大值,so,要动态的

SET @row=0;
SET @groupid='';
select a.deptid,a.salary
from
(
select deptid,salary,case when @groupid=deptid then @row:=@row+1 else @row:=1 end rownum,@groupid:=deptid from employee
order by deptid,salary desc
)a
where a.rownum<=2;

mysql还有其他写法,通过求出极值再进行关联

SELECT t.stuid,  
        t.stuname,  
        t.score,  
        t.classid  
FROM stugrade t  
where t.score = (SELECT max(tmp.score) from stugrade tmp where tmp.classid=t.classid)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ComplexHeatmap 是一个在 R 语言中用于制作复杂热图的软件包。在制作复杂热图时,分组聚类是一个非常重要的步骤,可以将矩阵中的样本或变量进行聚类,并将其按照一定的顺序排列,使得热图更加易于观察和解释。 下面是使用 ComplexHeatmap 进行分组聚类的基本步骤: 1. 导入数据并进行必要的预处理,例如标准化、去除缺失值等。 2. 使用 `dist()` 函数计算样本或变量之间的距离。 3. 使用 `hclust()` 函数进行层次聚类,并指定所需的聚类方法和距离度量。 4. 使用 `row_order` 或 `column_order` 参数将矩阵中的行或列按照聚类结果排序。 5. 使用 `Heatmap()` 函数制作热图,并将上一步得到的排序结果作为参数传递给 `row_order` 或 `column_order`。 例如,以下代码展示了如何使用 ComplexHeatmap 进行分组聚类: ```r library(ComplexHeatmap) # 导入数据并进行必要的预处理 data <- read.table("data.txt", header=TRUE, row.names=1) data_norm <- t(scale(t(data))) # 对行进行标准化 # 计算样本之间的距离并进行层次聚类 dist_mat <- dist(data_norm, method="euclidean") hc_res <- hclust(dist_mat, method="complete") # 将行按照聚类结果排序,并制作热图 Heatmap(data_norm, name="Expression", row_order=hc_res$order, show_row_names=FALSE) ``` 这段代码将导入一个名为 "data.txt" 的数据集,并对其进行行标准化。然后,使用 Euclidean 距离计算样本之间的距离,使用 Complete linkage 进行层次聚类。最后,将行按照聚类结果排序,并制作热图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值