mysql中over partition by的具体使用

 更新时间:2024年02月23日 11:51:03   作者:mob64ca12e2f123  
在数据库中,我们经常需要对数据进行分组排序等操作,MySQL的over partition by可以帮助我们更方便地进行这些操作,本文主要介绍了mysql中over partition by的具体使用,感兴趣的可以了解一下

前言

开发中遇到了这样一个需求:统计商品库存,产品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_idbranchstocks
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_idbranchstock
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_idbranchstockrank
P003小型套房451
P002高级标间3311
P005小型套房2231
P001豪华房991
P003经典房451
P004标准双床房671
P002豪华房561
P001高级标间771
P005经典房671
P003高级标间981
P002经典房231
P004经典房761
P002小型套房1231

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

到此这篇关于mysql中over partition by的具体使用的文章就介绍到这了,更多相关mysql over partition by内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在C#和MySQL中存取中文字符时避免乱码的方法

    在C#和MySQL中存取中文字符时避免乱码的方法

    这篇文章主要介绍了在C#和MySQL中存取中文字符时避免乱码的方法,主要还是老办法先转换成Unicode编码,需要的朋友可以参考下
    2015-05-05
  • MySQL生成连续的数字/字符/时间序列的方法

    MySQL生成连续的数字/字符/时间序列的方法

    有时候为了生成测试数据,或者填充查询结果中的数据间隔,需要使用到一个连续的数据序列值,所以,今天我们就来介绍一下如何在 MySQL 中生成连续的数字、字符以及时间序列值,需要的朋友可以参考下
    2024-04-04
  • 快速解决mysql57服务突然不见了的问题

    快速解决mysql57服务突然不见了的问题

    下面小编就为大家带来一篇快速解决mysql57服务突然不见了的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • phpmyadmin 4+ 访问慢的解决方法

    phpmyadmin 4+ 访问慢的解决方法

    很多人用了phpmyadmin4以后的版本发现速度好像慢了很多,总结下,提供解决方法。
    2013-11-11
  • MySQL 到底是如何做到多版本并发的

    MySQL 到底是如何做到多版本并发的

    这篇文章主要介绍了 MySQL 事务隔离级别的底层原理。大家一起来阅读下文吧
    2021-08-08
  • mysql开启慢查询(EXPLAIN SQL语句使用介绍)

    mysql开启慢查询(EXPLAIN SQL语句使用介绍)

    这篇文章主要介绍了mysql开启慢查询 EXPLAIN SQL语句,需要的朋友可以参考下
    2018-01-01
  • 初学者从源码理解MySQL死锁问题

    初学者从源码理解MySQL死锁问题

    这篇文章主要讲的是如何通过调试 MySQL 源码,知道一条 SQL 真正会拿哪些锁,不再抓虾,瞎猜或者何登成大神没写过的场景就不知道如何处理了,下面小编来和大家一起学习学习
    2019-05-05
  • mysql导入csv的4种报错的解决方法

    mysql导入csv的4种报错的解决方法

    这篇文章主要介绍了mysql导入csv的4种报错的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SQL字符型字段按数字型字段排序实现方法

    SQL字符型字段按数字型字段排序实现方法

    由于是按字母顺序排列,所以123排在了2的前面,显然不符合我们的要求,那么怎样才能按照我们预想的数字顺序排序呢
    2013-03-03
  • 深入解析MySQL双写缓冲区

    深入解析MySQL双写缓冲区

    双写缓冲区是MySQL中的一种优化方式,主要用于提高数据的写性能,本文将介绍Doublewrite Buffer的原理和应用,帮助读者深入理解其如何提高MySQL的数据可靠性并防止可能的数据损坏,感兴趣的可以了解一下
    2024-02-02

最新评论