首页 > 数据库 >MySQL实现over partition by(分组后对组内数据排序)

MySQL实现over partition by(分组后对组内数据排序)

时间:2023-04-03 18:33:35浏览次数:36  
标签:product partition over 组内 标间 branch 经典 id stock

 

开发中遇到了这样一个需求:统计商品库存,产品ID + 子产品名称都相同时,可以确定是同一款商品。当商品来自不同的渠道时,我们要统计每个渠道中最大的那一个。如果在Oracle中可以通过分析函数 OVER(PARTITION BY… ORDER BY…)来实现。在MySQL中应该怎么来实现呢。现在通过两种简单的方式来实现这一需求。
数据准备

/*Table structure for table `product_stock` */
CREATE TABLE `product_stock` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `product_id` varchar(10) DEFAULT NULL COMMENT '产品ID',
  `channel_type` int(11) DEFAULT NULL COMMENT '渠道类型',
  `branch` varchar(10) DEFAULT NULL COMMENT '子产品',
  `stock` int(11) DEFAULT NULL COMMENT '库存',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8;

/*Data for the table `product_stock` */

insert  into `product_stock`
(`id`,`product_id`,`channel_type`,`branch`,`stock`)
values (1,'P002',1,'豪华房',23),
(2,'P001',1,'高级标间',45),
(3,'P003',1,'高级标间',33),
(4,'P004',1,'经典房',65),
(5,'P003',1,'小型套房',45),
(6,'P002',2,'高级标间',331),
(7,'P005',2,'小型套房',223),
(8,'P001',1,'豪华房',99),
(9,'P002',3,'高级标间',65),
(10,'P003',2,'经典房',45),
(11,'P004',3,'标准双床房',67),
(12,'P005',2,'小型套房',34),
(13,'P001',1,'高级标间',43),
(14,'P002',3,'豪华房',56),
(15,'P001',3,'高级标间',77),
(16,'P005',2,'经典房',67),
(17,'P003',2,'高级标间',98),
(18,'P002',3,'经典房',23),
(19,'P004',2,'经典房',76),
(20,'P002',1,'小型套房',123);

通过分组聚合GROUP_CONCAT实现

SELECT
  product_id,
  branch,
  GROUP_CONCAT(t.stock ORDER BY t.stock DESC ) stocks
FROM (SELECT *
      FROM product_stock) t
GROUP BY product_id,branch

查询结果:
product_id    branch    stocks
P001    豪华房    99
P001    高级标间    77,45,43
P002    小型套房    123
P002    经典房    23
P002    豪华房    56,23
P002    高级标间    331,65
P003    小型套房    45
P003    经典房    45
P003    高级标间    98,33
P004    标准双床房    67
P004    经典房    76,65
P005    小型套房    223,34
P005    经典房    67

这也许并不是我们想要的结果,我们只要stocks中的最大值就可以,那么我们只要用SUBSTRING_INDEX函数截取一下就可以:

SELECT
  product_id,
  branch,
  SUBSTRING_INDEX(GROUP_CONCAT(t.stock ORDER BY t.stock DESC ),',',1) stock
FROM (SELECT *
      FROM product_stock) t
GROUP BY product_id,branch

查询结果:
product_id    branch    stock
P001    豪华房    99
P001    高级标间    77
P002    小型套房    123
P002    经典房    23
P002    豪华房    56
P002    高级标间    331
P003    小型套房    45
P003    经典房    45
P003    高级标间    98
P004    标准双床房    67
P004    经典房    76
P005    小型套房    223
P005    经典房    67
通过关联查询及COUNT函数实现

SELECT *
FROM (SELECT
        t.product_id,
        t.branch,
        t.stock,
        COUNT(*)     AS rank
      FROM product_stock t
        LEFT JOIN product_stock r
          ON t.product_id = r.product_id
            AND t.branch = r.branch
            AND t.stock <= r.stock
      GROUP BY t.id) s
WHERE s.rank = 1

查询结果:
product_id    branch    stock    rank
P003    小型套房    45    1
P002    高级标间    331    1
P005    小型套房    223    1
P001    豪华房    99    1
P003    经典房    45    1
P004    标准双床房    67    1
P002    豪华房    56    1
P001    高级标间    77    1
P005    经典房    67    1
P003    高级标间    98    1
P002    经典房    23    1
P004    经典房    76    1
P002    小型套房    123    1

通过关联表本身,联接条件中:t.stock <= r.stock,当t.stock = r.stock时,COUNT出来的数量是1,当t.stock < r.stock时,COUNT出来的数量2,3,4…由此可以给所有的数据根据stock字段做一个排序,而这个排序中所有为1的,就是我们所需求的数据,然后通过按id分组,得到结果。通过这种方式,也可以实现上面的需求。

版权声明:本文为CSDN博主「MrCao杰罗尔德」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37797991/article/details/80511855

 

标签:product,partition,over,组内,标间,branch,经典,id,stock
From: https://www.cnblogs.com/yzl042349/p/17283993.html

相关文章

  • Smarter Stand:让SmartCover更加Smart
    这个小东西叫做SmarterStand,由硅胶制成可以卡在SmartCover任意两节的接合处让用户自行调节组合造型。可以自行选择SmartCover的摆放样式和高度。SmarterStand可以很好的贴合在合页之间最后两节扣起来可以更加方便用来发邮件、打字更方便把第二和第三节扣上会更适合用来浏览......
  • 文字下划线hover穿梭特效 - CSS
    Code:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • overcommit_memory的简单学习
    overcommit_memory的简单学习背景前几天一个测试环境启动失败.总是有如下的提示:Nativememoryallocation(mmap)failedtomap12288bytesforcommittingreservedmemory.当时看free其实内存剩余总量还是有的.但是JVM启动总是失败.当时没有考虑太多.改了下参数......
  • The following untracked working tree files would be overwritten by merge错误的
    问题描述只要云端代码更新,我的本地那里没有跟上云端的更新速度,就会出现这个错误:问题解决在Git终端里面,输入gitclean-d-f"出现错误的那个文件路径(就是错误显示的那一串)"然后Enter,会显示Removing了那个文件,然后再输入gitpull,显示这个:然后就等待它更新完成就行了。然后......
  • 一维数组内存分析
    Java虚拟机的内存划分为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。区域名称作用虚拟机栈用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度<br/>的各种基本数据类型、对......
  • ROW_NUMBER() over(partition by id order by id) as autoid 分组排序
    项目数据量小的并不能反应出问题,数据量一大的时候,就会出现各种问题。其中要用到一个思路,就是要根据某个ID来进行从1开始排序,也就是分组排序SqlServer2008:ROW_NUMBER()over(partitionby分组列名orderby排序列名)这样同分组列下,就会从1开始排。 ......
  • 刷机必看recovery和fastboot是什么…
    一、recovery在刷机这件湿中你经常会看到recovery的身影,从字面上来看就是【恢复】的意思,大家可以直接把recovery当作一个【刷机界面】。一般某些手机的刷机和提ROOT也需要recovery的刷新。再说一下recovery几个主要的功能,不过每个手机的recovery都有一些区别,可能不太一样,如果你......
  • mongodb分组且提取组内所有数据到一个数组里面方式
    db.tempdata.insertMany([{name:"AAA",age:14,country:"us"},{name:"BBB",age:13,country:"us"},{name:"......
  • ***25:SwiftUI-Popover 模态弹出
      正文 ////PopoverPage.swift//SwiftUIDeom////Createdbyzhoukang03on2023/3/28.//importSwiftUIstructPopoverPage:View{@St......
  • CSS overflow 属性
    实例设置overflow属性:div{width:150px;height:150px;overflow:scroll;}浏览器支持所有主流浏览器都支持overflow属性。注释:任何的版本的InternetExp......