首页 > 数据库 >SQL进阶技巧:如何获取状态一致的分组? | 最大、最小值法

SQL进阶技巧:如何获取状态一致的分组? | 最大、最小值法

时间:2024-09-29 22:20:00浏览次数:11  
标签:水果 进阶 魔方 草莓 拼盘 最小值 SQL ready platter

目录

0 需求描述

1 数据准备

2 问题分析

   方法1:最大、最小值法(技巧)

  方法2:常规思路

3 小结

  如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:

数字化建设通关指南专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢复原价


0 需求描述

星星点灯是一家水果店,它提供了外卖水果拼盘的服务。水果店能够提供四种水果拼盘:水果魔方、海星欧蕾、猫头鹰、草莓雪山,下表反应了某一时刻店内的水果的准备情况。

    id  platter       fruit       ready  
------  ------------  ---------  --------
     1  水果魔方        猕猴桃            1
     2  水果魔方        香蕉              1
     3  水果魔方        菠萝              1
     4  水果魔方        芒果              1
     5  水果魔方        哈密瓜            1
     6  海星欧蕾        草莓              1
     7  海星欧蕾        橙子              0
     8  猫头鹰          猕猴桃            1
     9  猫头鹰          小橘子            0
    10  猫头鹰          橙子              0
    11  猫头鹰          草莓              1
    12  草莓雪山        草莓              1

上面这些数据存在 platters 表中,platter 是拼盘的名称,fruit 是拼盘要用到的水果,ready 表示水果是否准备好了。当有客户订水果拼盘时,只有拼盘要用到的所有水果都准备好了才能制作。

现在,我们要写 SQL 找出可以立即制作的水果拼盘的名称。

--------------
水果魔方  
草莓雪山  

1 数据准备

create table platters as
    (select stack(
                    12,
                    1, '水果魔方', '猕猴桃', 1,
                    2, '水果魔方', '香蕉', 1,
                    3, '水果魔方', '菠萝', 1,
                    4, '水果魔方', '芒果', 1,
                    5, '水果魔方', '哈密瓜', 1,
                    6, '海星欧蕾', '草莓', 1,
                    7, '海星欧蕾', '橙子', 0,
                    8, '猫头鹰', '猕猴桃', 1,
                    9, '猫头鹰', '小橘子', 0,
                    10, '猫头鹰', '橙子', 0,
                    11, '猫头鹰', '草莓', 1,
                    12, '草莓雪山', '草莓', 1
            ) as (id, platter, fruit, ready));

2 问题分析

   方法1:最大、最小值法

   思路:本题中ready字段中只有0和1值,因此我们可以利用最小值这种极值思维构建辅助条件。当min(ready) =1说明该字段中所有的值都为1.

第一步:求出ready中的最小值,进行辅助判断

select platter
     , min(ready) flg
from platters
group by platter

 

为了更好理解此问题我们可以利用窗口函数 min(ready) over (partition by platter) 求出结果并与ready值进行对比分析,这样更直观一些。

select id
     , platter
     , fruit
     , ready
     , min(ready) over (partition by platter) flg
from platters

 

步骤2:当flg=1时说明ready中全为1,则符合条件,并获取最终结果。

select platter
from (select platter
           , min(ready) flg
      from platters
      group by platter) t
where flg = 1

 

上述代码可以简化为:

最终SQL如下

select platter
from platters
group by platter
having min(ready) = 1

方法2:常规思路,需要水果种类数等于准备好的状态数时则满足条件

比如水果魔方,它需要的水果有 5 种,当这些水果处于准备好的状态的数量也为 5 时,它就可以被制作了。 

SELECT platter
FROM platters
GROUP BY platter
HAVING SUM(ready) = COUNT(*);

 

上述方式还可以优化为,当某个水果拼盘下没准备好的水果的数量为 0 时,这个拼盘可以被制作。即:

SELECT platter
FROM platters
GROUP BY platter
HAVING SUM(IF(ready = 0, 1, 0)) = 0

3 小结

本文提供了三种不同的SQL查询方法来实现这一目标,其中最大、最小值这种极限思维的分析方法最为优雅,作为一种技巧需要掌握。

  如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:
数字化建设通关指南
专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢复原价

 

主要内容:
(1)SQL进阶实战技巧
可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得
       1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

       10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

       11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:

数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

 

标签:水果,进阶,魔方,草莓,拼盘,最小值,SQL,ready,platter
From: https://blog.csdn.net/godlovedaniel/article/details/142603475

相关文章

  • 今日一学,sql优化,创建索引的优缺点
    收藏了,但是不打开,久而久之就忘了,今日一学!所谓是好记性不如烂键盘。**2024Javaoffer收割指南**sql优化尽量避免使用select*,返回无用的字段会降低效率。优化方式:只能使用具体的字段代替select具体字段,只返回使用到的字段。(虽然我经常select*但是一个表字段非常多,那......
  • PostgreSQL是否有等待事件
    PostgreSQL是否有等待事件PostgreSQL提供了等待事件(WaitEvents)的机制,用于监控数据库运行过程中因资源争用而导致的等待情况。这些等待事件可以帮助数据库管理员识别导致性能问题的瓶颈,例如锁冲突、I/O等待等。什么是等待事件?等待事件是指PostgreSQL中的进程在等待某......
  • 基于Python+flask+MySQL+HTML的全国范围水质分析预测系统,可视化用echarts,预测算法随机
    1绪论近年来,水质监测系统的进步显著,这在全球环保意识不断提升的背景下尤为明显。大量资源被投入到水质监测技术的研发和应用中,以不断优化监测效能。水资源的保护及健康环境的维护,这种趋势旨在提升人们生活质量,确保优质的生活条件。通过持续不懈的努力,我们得以实现对水质的及......
  • Windows下绿色安装PostgreSQL笔记
    介绍PostgreSQL,Postgres,以下简称为PG,是一款关系型数据库,本地安装支持两种方式,一键安装和绿色解压安装两种方式下载、解压安装版:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads绿色解压版:https://www.enterprisedb.com/download-postgres......
  • C++学习:模版进阶:非类型模板参数 特化 分离编译
    目录一:非类型模版参数二:模版特化三:函数模版特化四:类模版特化一:全特化(将模板参数列表中所有的参数都确定化)二:偏特化(部分特化或更进一步限制)五:模版分离编译一:非类型模版参数非类型模版参数是在模版参数列表中,跟在模版参数后面的,就是用常量当参数(下面的n就是)templa......
  • MySQL8主从搭建
    MySQL8主从搭建基础环境基本信息:虚拟化软件:OracleVMVirtualBox1C/2G1个网卡80G系统盘oracle:mysql-8.0.20yum:CentOS-7.6-x86_64-DVD-1810.iso服务器IP规划:主机名mysql1mysql2mysql3系统CentOS-7.6CentOS-7.6CentOS-7.6IP192.168.56.41192.168.56.42192.168.56.......
  • MySQL数据库初级学习笔记---第一章-数据库概述
    第一章-数据库概述聊聊数据库数据库是一门独立的学科,只要是做软件开发的,数据库都要学。数据库(电子化的文件柜)是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。它的存储空间很大,可以存放百万条......
  • MySQL 默认 only_full_group_by
    ONLY_FULL_GROUP_BY是MySQL中的一个SQL模式,它要求在使用GROUPBY语句时,SELECT列表、HAVING条件或ORDERBY列表中的每个列,要么是聚合函数的一部分(如COUNT(),SUM(),AVG()等),要么必须在GROUPBY子句中明确指定。这个模式的设计初衷是增强查询的准确性和可预测性,避免因为列的不明确引......
  • Flink(六)Table API和Flink SQL
    TableAPI和FlinkSQL整体介绍概念TableAPI是一套内嵌在Java和Scala语言中的查询API,它允许我们以非常直观的方式,组合来自一些关系运算符的查询,比如select、filter和joinFlinkSQL,就是直接可以在代码中写SQL,来实现一些查询(Query)操作无论输入是批输入还是流式输入,在这两套API......
  • PbootCMS数据库配置,修改为Mysql数据库,配置Mysql出错解决办法
    在PbootCMS中,如果你需要将默认的SQLite数据库切换为MySQL数据库,可以按照以下步骤进行操作。以下是详细的步骤和示例代码:1.导入MySQL数据库文件备份现有数据:确保先备份现有的SQLite数据库。导入MySQL数据库文件:将MySQL数据库文件(位于/static/backup/sql/xxx.sql)导入到MySQL......