力扣刷题(sql)--零散知识点(2)

1.自定义分组后的分类统计问题(某组内无数据却仍要展示)

例题1:

查询每个工资类别的银行账户数量。 工资类别如下:

  • "Low Salary":所有工资 严格低于 20000 美元。
  • "Average Salary": 包含 范围内的所有工资 [$20000, $50000] 。
  • "High Salary":所有工资 严格大于 50000 美元。

结果表 必须 包含所有三个类别。 如果某个类别中没有帐户,则报告 0。

输入:
Accounts 表:
+------------+--------+
| account_id | income |
+------------+--------+
| 3          | 108939 |
| 2          | 12747  |
| 8          | 87709  |
| 6          | 91796  |
+------------+--------+
输出:
+----------------+----------------+
| category       | accounts_count |
+----------------+----------------+
| Low Salary     | 1              |
| Average Salary | 0              |
| High Salary    | 3              |
+----------------+----------------+

这里主要难点就是把这类“Average Salary”组内没有符合条件的分组不能将其省略,可以通过以下方法,用union来操作,不是很高级的方法,但很完美实现了目的,适用于分组比较少的情况,真的很实用。

select 'Low Salary' category,count(*) accounts_count from Accounts
where income<20000
union
select 'Average Salary' category,count(*) accounts_count from Accounts
where income between 20000 and 50000
union
select 'High Salary' category,count(*) accounts_count from Accounts
where income>50000

2. 用union增加不好分组的组的信息  

上面是一个例子,“Average Salary”这一组由于其没有满足的数据,所以我们用group by往往不好对其处理。那就对这组单独处理分组后union到之前正常能分组的结果中。

以下是另一个例子:

编写一个解决方案,找出在 2019-08-16 时全部产品的最新价格,假设所有产品在修改前的价格都是 10 。

示例 1:

输入:
Products 表:
+------------+-----------+-------------+
| product_id | new_price | change_date |
+------------+-----------+-------------+
| 1          | 20        | 2019-08-14  |
| 2          | 50        | 2019-08-14  |
| 1          | 30        | 2019-08-15  |
| 1          | 35        | 2019-08-16  |
| 2          | 65        | 2019-08-17  |
| 3          | 20        | 2019-08-18  |
+------------+-----------+-------------+
输出:
+------------+-------+
| product_id | price |
+------------+-------+
| 2          | 50    |
| 1          | 35    |
| 3          | 10    |
+------------+-------+

这里product_id为3的产品在‘2019-08-16’前都没出现过,不方便加入其他id组的讨论中,那就只能将其单独构建除结果内容后用union和返回的其他产品id返回的结果拼接。

本题参考代码如下,还用到了row_number构建序号列配合排序和排序倒序为1找极值。


selectproduct_id, new_price as price
from(selectproduct_id,new_price,change_date,(row_number() over (partition by product_id order by change_date DESC)) r
from products 
where date(change_date) <= '2019-08-16') a
where r='1'unionselectproduct_id, 10 as price 
fromProducts 
group byproduct_id
havingmin(change_date)>'2019-08-16';

3. 起累加作用的语句 

下面是根据turn列,来做累加的语句,又用到了over啥的,我们之前学习的row_number、lag函数已经提到过了,那这里也能不能用partition by呢,肯定也是可以的。

SUM(weight) OVER (ORDER BY turn)

举例说明:

athlete_idathlete_nameweightturn
1John701
2Mike752
3Sarah653
4Linda804
5Paul685
SELECT athlete_name,weight,SUM(weight) OVER (ORDER BY turn) AS cumulative_weight
FROM weights
ORDER BY turn;
athlete_nameweightcumulative_weight
John7070
Mike75145
Sarah65210
Linda80290
Paul68358

4. 经典例题:换座位

示例 1:

输入: 
Seat 表:
+----+---------+
| id | student |
+----+---------+
| 1  | Abbot   |
| 2  | Doris   |
| 3  | Emerson |
| 4  | Green   |
| 5  | Jeames  |
+----+---------+
输出: 
+----+---------+
| id | student |
+----+---------+
| 1  | Doris   |
| 2  | Abbot   |
| 3  | Green   |
| 4  | Emerson |
| 5  | Jeames  |
+----+---------+
解释:
请注意,如果学生人数为奇数,则不需要更换最后一名学生的座位。

这题很经典,可以单独拿出来作为一个知识点。

我第一次没做出来,下面是两种很棒的思路。

1.将偶数 id 减 2 后重排即可

select 
rank() over(order by if(id % 2 = 0,id-2,id)) as id,student 
from seat

这不是我写的代码,看起来很简洁有效,我懂了思路后,还要再进一步学习其窗口函数rank()的应用,以及窗口函数后面order by加上if配合的使用。这里应该是直接把处理好的id用于窗口函数order by的排序了,牛,我可能还要再来个中间表啥的。

2.更符合逻辑的思路(逻辑非常易懂)

SELECT (CASE WHEN MOD(id,2) = 1 AND id = (SELECT COUNT(*) FROM seat) THEN idWHEN MOD(id,2) = 1 THEN id+1ElSE id-1END) AS id, student
FROM seat
ORDER BY id;

这里用到case来处理超过两种情况的条件判断。首先,明确这题的处理对象,最好是id,因为id是简单连续数字,可以做简单加减运算。

值得注意的是,如果最后一个学生序号为奇数,那就不要换了。所以要求最多的,可能为奇数的最后一个序号优先处理,放在case的第一个判断框,让它直接等于它本身;第二个放不是最后一个序号的技术序号,让他序号加1;最后只有偶数序号了,全部减1;完美的逻辑。

5. 注意date_format()里面的参数

终于实践代码的时候用到了date_format()函数,特别有用的函数,特别是在分类的时候。有几点注意事项,是关于参数的。

SELECT DATE_FORMAT(created_at, '%Y-%m-%d') AS full_date,DATE_FORMAT(created_at, '%Y') AS four_digit_year,DATE_FORMAT(created_at, '%y') AS two_digit_year,DATE_FORMAT(created_at, '%M') AS full_month_name,DATE_FORMAT(created_at, '%m') AS two_digit_month,DATE_FORMAT(created_at, '%D') AS day_with_suffix
FROM some_table;

结果如下: 

执行上述查询后的结果如下:

full_datefour_digit_yeartwo_digit_yearfull_month_nametwo_digit_monthday_with_suffix
2024-10-01202424October101st

解释:

最常用的是%Y-%m-%d,尤其是%Y-%m,常用于具体年月的分组。

6. 单个union语句只能使用一个order by或limit

  • ORDER BYUNION 中的使用:

    • ORDER BY 应该放在整个 UNION 查询的最后,而不是每个子查询中。你可以在子查询内部使用 ORDER BY,但通常要使用子查询包装。
  • LIMIT 也需要注意:

    • UNION 中,你可以对每个子查询使用 LIMIT,但不能在 UNION 之后直接再使用单独的 ORDER BY

   举个例子,下面如果不加括号就会报错。

(selectu.name results
frommovierating m
order byu.name
limit 1)union all(selectmv.title results
frommovierating m
order bymv.title
limit 1);
  • 加括号明确了每个查询的范围,让每个查询都能独立执行自己的 ORDER BYLIMIT,然后再用 UNION 合并。
  • 不加括号时,数据库认为 ORDER BYLIMIT 试图对整个 UNION 操作生效,但 SQL 标准不允许这种用法。

 值得一提的是,这里用到了union all,有的时候用的上,它不会去掉重复的返回行(重复指每一列的数据都一样),union会。

--------------------------------------------------------------------------------------------------------------

例题 :

输入:
Customer 表:
+-------------+--------------+--------------+-------------+
| customer_id | name         | visited_on   | amount      |
+-------------+--------------+--------------+-------------+
| 1           | Jhon         | 2019-01-01   | 100         |
| 2           | Daniel       | 2019-01-02   | 110         |
| 3           | Jade         | 2019-01-03   | 120         |
| 4           | Khaled       | 2019-01-04   | 130         |
| 5           | Winston      | 2019-01-05   | 110         | 
| 6           | Elvis        | 2019-01-06   | 140         | 
| 7           | Anna         | 2019-01-07   | 150         |
| 8           | Maria        | 2019-01-08   | 80          |
| 9           | Jaze         | 2019-01-09   | 110         | 
| 1           | Jhon         | 2019-01-10   | 130         | 
| 3           | Jade         | 2019-01-10   | 150         | 
+-------------+--------------+--------------+-------------+
输出:
+--------------+--------------+----------------+
| visited_on   | amount       | average_amount |
+--------------+--------------+----------------+
| 2019-01-07   | 860          | 122.86         |
| 2019-01-08   | 840          | 120            |
| 2019-01-09   | 840          | 120            |
| 2019-01-10   | 1000         | 142.86         |
+--------------+--------------+----------------+
解释:
第一个七天消费平均值从 2019-01-01 到 2019-01-07 是restaurant-growth/restaurant-growth/ (100 + 110 + 120 + 130 + 110 + 140 + 150)/7 = 122.86
第二个七天消费平均值从 2019-01-02 到 2019-01-08 是 (110 + 120 + 130 + 110 + 140 + 150 + 80)/7 = 120
第三个七天消费平均值从 2019-01-03 到 2019-01-09 是 (120 + 130 + 110 + 140 + 150 + 80 + 110)/7 = 120
第四个七天消费平均值从 2019-01-04 到 2019-01-10 是 (130 + 110 + 140 + 150 + 80 + 110 + 130 + 150)/7 = 142.86

做了很久这道题,加上gpt的帮忙,才得到下面的答案:

selectvisited_on,total_amount amount,average_amount
from(SELECT visited_on,SUM(amount) OVER (ORDER BY visited_on RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW) AS total_amount,ROUND(AVG(amount) OVER (ORDER BY visited_on RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW), 2) AS average_amount
FROM (select customer_id,name,visited_on,sum(amount) amount from customer group by visited_on) c
ORDER BY visited_on) c2
where visited_on
IN(select distinct visited_on from customerwhere datediff(visited_on,(select min(visited_on) from customer)) >= 6);

先介绍一下具体逻辑(由里到外):

这里某个日期还有多个数据,先用groupby用日期分组,把相同日期的数据先加起来,让每个日期只有一个数据。

然后用sum、avg窗口函数配合range或者rows(等下会讲),计算从这行开始加上前面6行(总共七行)的总和和平均值,目前得到每一个单独日期的总和和平均值

最后找出返回的日期,从1号开始,只有7号开始后的日期才有7天的周期可言。即7号的周期为1号到7号,8号的周期为2号到8号......返回7号之后的日期。这里对应着上面代码的where visited_on in(7号,8号......),最终就返回指定日期的总和和平均值,这里是7、8、9、10号。

7. 窗口函数的rows、range应用

下面是窗口函数中rows、range的语法及运用:

SUM(amount) OVER (ORDER BY visited_on ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)SUM(amount) OVER (ORDER BY visited_on RANGE BETWEEN INTERVAL 6 DAY PRECEDING AND CURRENT ROW)

其中rows那一行起到的作用是,配合sum对当前行以及当前行的前面六行总共七行进行求和,rows是基于物理行的,即只看行数;而range则类似,配合sum对当前行的日期以及当前行的日期的前六天,总共七天的内容进行求和,range是基于基于逻辑值的。这里是sum,当然也可以配合avg等其他函数使用,真的很好用。

8. interval的用法

Interval 在英文里表示:间隔、时间段,指两个时间或事件之间的距离。在 SQL 中,INTERVAL 用来表示日期和时间的时间间隔。它用于增加或减少日期时间,以便进行计算。

interval主要的两个常见用法:

1. 计算日期(用字段加减interval的时间段,来定义新的时间)

SELECT visited_on - INTERVAL 1 DAY AS previous_day
FROM customer;SELECT *
FROM orders
WHERE order_date > NOW() - INTERVAL 30 DAY;

2. 配合函数

SELECT DATE_ADD('2024-10-28', INTERVAL 1 YEAR + 2 MONTH) AS new_date;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码复现detectron2时遇到的错误

说明&#xff1a;安装detectron2直接进到官网 detectron2源码 中找安装文档&#xff0c;安装安装文档一般没什么问题&#xff0c;但是我确实出现了问题&#xff0c;包括有&#xff1a; gcc版本太低&#xff1a;提示说需要gcc 9及以上的版本才可以pytorch版本不匹配&#xff1a…

【机器学习基础】激活函数

激活函数 1. Sigmoid函数2. Tanh&#xff08;双曲正切&#xff09;函数3. ReLU函数4. Leaky ReLU函数 1. Sigmoid函数 观察导数图像在我们深度学习里面&#xff0c;导数是为了求参数W和B&#xff0c;W和B是在我们模型model确定之后&#xff0c;找出一组最优的W和B&#xff0c;使…

ipad-make-sense:首个支持 iPad 的开源数据标注工具

在机器学习和人工智能快速发展的今天&#xff0c;高质量的数据标注工具变得越来越重要。然而&#xff0c;大多数现有的数据标注工具都局限于传统的桌面环境&#xff0c;无法适应现代移动办公的需求。今天&#xff0c;我要向大家介绍一个突破性的解决方案 —— ipad-make-sense&…

阳振坤:云时代数据库的思考 | OceanBase发布会实录

在2024 OceanBase 年度发布会中&#xff0c;OceanBase 的创始人与首席科学家阳振坤进行了《云时代数据库的思考》的主题分享。本文为演讲实录。 亲爱的朋友们&#xff0c;衷心感谢各位莅临今天的发布会现场。今天是一个云的时代&#xff0c;我想与大家分享&#xff0c;我对于云…

51单片机完全学习——DS18B20温度传感器

一、DS18B20数据手册解读 首先我们知道DS18B20使用的是单总线传输&#xff0c;默认情况下读出来的温度是12位的&#xff0c;我们这里只讨论外部电源供电这种情况。 有这张图片我们知道&#xff0c;12位温度的最小分辨率是10^-4次方&#xff0c;因此就是0.0625.我们只需要将最后…

leetcode hot100【LeetCode 94. 二叉树的中序遍历】java实现

LeetCode 94. 二叉树的中序遍历 题目描述 给定一个二叉树&#xff0c;返回它的中序遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&…

Docker快速安装Grafana

#创建数据目录 sudo mkdir -p /app/grafana/config sudo mkdir -p /app/grafana/data sudo chmod -R 777 /app/grafana/config sudo chmod -R 777 /app/grafana/data #配置文件grafana.ini ##################### Grafana Configuration Example ##################### # # E…

STM32应用详解(12)使用I2C的main函数例程

文章目录 前言一、支持I2C总线的常见器件二、程序详解1.main函数2.读取传感器温度值的函数3.相关宏定义 前言 学习I2C总线。本文件主要分析main函数和LM75A驱动程序。了解器件驱动基本原理。 一、支持I2C总线的常见器件 (1)支持I2C总线的器件有很多&#xff0c;在开发板上支持…

redis详细教程(3.ZSet,Bitmap,HyperLogLog)

ZSet Redis 的 ZSet&#xff08;有序集合&#xff09;是一种特殊的数据类型&#xff0c;它允许存储一系列不重复的字符串元素&#xff0c;并为每个元素关联一个分数&#xff08;score&#xff09;。这个分数用于对集合中的元素进行排序。ZSet 的特点是&#xff1a; 唯一性&am…

Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中

本示例介绍如何在vue+openlayers项目中设置带有箭头的线段,箭头位于线段的中间位置。这里用到 forEachSegment 函数, 这个函数接受一个特征和一个回调函数作为参数。它遍历特征中的每个子线段,并调用回调函数传入子线段的中点坐标。 效果图 专栏名称内容介绍Openlayers基础…

代码布局风格指南

代码布局风格指南 本内容面向于新手&#xff0c;内容也比较笼统&#xff0c;看文章阅读量&#xff0c;如果阅读和点赞量较高&#xff0c;就会开一个专栏来进行详细的说明。 在编写C语言代码时&#xff0c;良好的代码风格不仅能够提高代码的可读性&#xff0c;还能方便团队协作…

Springboot整合spring-boot-starter-data-elasticsearch

前言 <font style"color:rgb(36, 41, 47);">spring-boot-starter-data-elasticsearch</font> 是 Spring Boot 提供的一个起始依赖&#xff0c;旨在简化与 Elasticsearch 交互的开发过程。它集成了 Spring Data Elasticsearch&#xff0c;提供了一套完整…

51c自动驾驶~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11491137 #BEVWorld BEV潜在空间构建多模态世界模型&#xff0c;全面理解自动驾驶~一、引言 世界模型建模了有关环境的知识&#xff0c;其可以通过给定的条件对未来进行合理的想象。未来想象要求世界模型具有物理规律的理解…

秦时明月2搭建笔记

1.具体配置 数据库不修改&#xff0c;如果修改了&#xff0c;gm那边也要 2.数据库 3.上传配置文件出现问题 参考&#xff1a;对于测试时&#xff0c;错误信息 Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large-CSDN博客 4.启动tomcat&#x…

“冷”在日语里有这些表达-柯桥商务日语培训成人零基础学习

“冷”在日语里有这些表达: 寒い 这是最常用的表达,与中文的“冷”意思相同。 例句: 部屋が寒いから、エアコンをつけます。(房间冷,我去开空调。) 冷たい 形容物体表面温度较低,有“冷的”的意思。 例句: この水は冷たいですね。(这水挺冷的。) にぶい 指饮料不够冰镇…

安全芯片 OPTIGA TRUST M 使用介绍与示例(基于STM32裸机)

文章目录 目的资料索引硬件电路软件框架介绍数据存储框架移植框架使用 使用示例示例地址与硬件连接通讯测试功能测试 总结 目的 OPTIGA TRUST M 是英飞凌推出的安全芯片&#xff0c;芯片通提供了很多 slot &#xff0c;用于存放各类安全证书、密钥、用户数据等&#xff0c;内置…

Python: Print Table on console

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # OS : windows 10 # Datetime : 2024/10/28 22:08 # User : geo…

Midjourney中文版:激发无限创意的艺术之旅

在数字化时代&#xff0c;艺术创作已不再受限于传统工具与技巧的束缚。Midjourney中文版&#xff0c;作为一款专为国内用户打造的智能艺术平台&#xff0c;正以超凡的智能算法和丰富的功能&#xff0c;引领每一位创作者踏上一场前所未有的艺术之旅。 Midjourney AI超强绘画 (原…

Spring+SpringMVC+SpringJDBC搭建web项目实现商品查询

准备工作&#xff1a;创建商品数据库&#xff0c;以及商品表 #创建数据库 DROP DATABASE IF EXISTS goodsDB; CREATE DATABASE goodsDB; USE goodsDB; #创建商品表 goods #id number 商品编号&#xff0c;主键 #name Varchar2(50) 商品名称&#xff0c;非空 #Price Numbe…

OpenHarmony鸿蒙应用开发 | 如何使用vsCode配置cangjie(仓颉)插件编程

前沿 余承东余总&#xff08;余大嘴&#xff09;在2024年10月21日鸿蒙【原生鸿蒙之夜暨华为全场景新品发布会】现场说&#xff0c;cangjie会成为鸿蒙下一代的编程语言&#xff0c;为开发者提供更强大的编程能力&#xff0c;让开发者在鸿蒙设备上实现更多创意。目前cangjie正处…