MYSQL查询获取一列在不同组中多次出现并符合特定条件的所有结果

标签 mysql sql mariadb

假设我有以下数据:

object    size    color    units
------    ----    -----    -----
ball      small   red      3
ball      small   red      2
ball      medium  blue     2
ball      medium  blue     1
ball      big     yellow   2
hat       big     green    3
hat       big     green    4
umbrella  medium  blue     1
umbrella  medium  blue     4
umbrella  big     blue     4
umbrella  huge    red      2
umbrella  huge    green    1
book      small   white    4
book      small   brown    3
book      medium  brown    2

我需要一个查询来返回所有对象的所有对象颜色大小变化,其中至少一个变化的大小和颜色的总单位至少为 5,因此查询将返回这些行:

object    size    color    total_units
------    ----    -----    ------
ball      small   red      5
ball      medium  blue     3
ball      big     yellow   2
umbrella  medium  blue     5
umbrella  big     blue     4
umbrella  huge    red      2
umbrella  huge    green    1

之所以会出现所有球及其每个尺寸-颜色变化的总数,是因为至少有 2 个不同的球,并且其中至少一个球的总单位数为 5 个或更多

之所以在结果中出现所有雨伞及其每个尺寸-颜色变化的总数,是因为至少有 2 把不同的雨伞,并且至少其中一把的总单位数为 5 或更多

帽子没有出现在结果中的原因是因为即使有超过 5 个单位(7)的大绿帽子,也没有至少 2 个不同的帽子

没有一本书出现在结果中的原因是即使有 3 本不同的书,也没有至少 5 个单元。

感谢您向我展示如何实现这一目标!

最佳答案

使用窗口函数(在最新版本的 MySQL 和 MariaDB 数据库中),这很容易:

select object, size, color, total_units
from (select object, size, color, sum(units) as total_units,
             max(sum(units)) over (partition by object) as max_total_units,
             count(*) over (partition by object) as cnt
      from t
      group by object, size, color
     ) t
where max_total_units >= 5 and cnt > 1;

关于MYSQL查询获取一列在不同组中多次出现并符合特定条件的所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53692975/

相关文章:

php - 通过 JOIN 和 GROUP BY 获取最近的行?

sql - 整数列是否包含值

mysql - 引导 Galera 集群失败

java - 在 jooq 中选择二进制(16),但显示十六进制字符串

c# - 是否可以从存储过程访问 Azure Blob?

mysql - Adminer 和 phpmyadmin 的 UTF-8 输入问题

mysql - vaadin 和 mysql 数据库中的乐观锁定

mysql - 合并 sqlite 查询的行

mysql - 动态表单字段验证的数据库设计

mysql - 扩展结果集,添加从另一个表的不同行中获取的列