20240106 SQL基础50题打卡

20240106 SQL基础50题打卡

1164. 指定日期的产品价格


产品数据表: Products

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| new_price     | int     |
| change_date   | date    |
+---------------+---------+
(product_id, change_date) 是此表的主键(具有唯一值的列组合)。
这张表的每一行分别记录了 某产品 在某个日期 更改后 的新价格。

编写一个解决方案,找出在 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    |
+------------+-------+

题解:

select p1.product_id, ifnull(p2.new_price, 10) as price
from (select distinct product_idfrom products
) as p1 -- 所有的产品
left join (select product_id, new_price from productswhere (product_id, change_date) in (select product_id, max(change_date)from productswhere change_date <= '2019-08-16'group by product_id)
) as p2 -- 在 2019-08-16 之前有过修改的产品和最新的价格
on p1.product_id = p2.product_id

这里我没想到用左连接来这样子连接,只是查出了那些在 16 号之前有修改的信息,害!

1204. 最后一个能进入巴士的人


表: Queue

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| person_id   | int     |
| person_name | varchar |
| weight      | int     |
| turn        | int     |
+-------------+---------+
person_id 是这个表具有唯一值的列。
该表展示了所有候车乘客的信息。
表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。
turn 决定了候车乘客上巴士的顺序,其中 turn=1 表示第一个上巴士,turn=n 表示最后一个上巴士。
weight 表示候车乘客的体重,以千克为单位。

有一队乘客在等着上巴士。然而,巴士有1000 千克 的重量限制,所以其中一部分乘客可能无法上巴士。

编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上巴士且不会超重。

返回结果格式如下所示。

示例 1:

输入:
Queue 表
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5         | Alice       | 250    | 1    |
| 4         | Bob         | 175    | 5    |
| 3         | Alex        | 350    | 2    |
| 6         | John Cena   | 400    | 3    |
| 1         | Winston     | 500    | 6    |
| 2         | Marie       | 200    | 4    |
+-----------+-------------+--------+------+
输出:
+-------------+
| person_name |
+-------------+
| John Cena   |
+-------------+
解释:
为了简化,Queue 表按 turn 列由小到大排序。
+------+----+-----------+--------+--------------+
| Turn | ID | Name      | Weight | Total Weight |
+------+----+-----------+--------+--------------+
| 1    | 5  | Alice     | 250    | 250          |
| 2    | 3  | Alex      | 350    | 600          |
| 3    | 6  | John Cena | 400    | 1000         | (最后一个上巴士)
| 4    | 2  | Marie     | 200    | 1200         | (无法上巴士)
| 5    | 4  | Bob       | 175    | ___          |
| 6    | 1  | Winston   | 500    | ___          |
+------+----+-----------+--------+--------------+

题解:

# SELECT a.person_name
# FROM Queue a, Queue b
# WHERE a.turn >= b.turn
# GROUP BY a.person_id HAVING SUM(b.weight) <= 1000
# ORDER BY a.turn DESC
# LIMIT 1SELECT a.person_name
FROM (SELECT person_name, @pre := @pre + weight AS weightFROM Queue, (SELECT @pre := 0) tmpORDER BY turn
) a
WHERE a.weight <= 1000
ORDER BY a.weight DESC
LIMIT 1

解释:

这个 SQL 查询旨在选择排队的人员,他们按照顺序依次加权,并且找出权重总和不超过 1000 的最后一个人。让我逐步解释这个查询:

  1. SELECT person_name: 查询语句要返回的结果是 person_name,即人员的名字。

  2. 这是一个嵌套查询。内部的子查询是一个使用变量 @pre 的查询,其中 @pre := @pre + weight 这个表达式在每一行中将权重值进行累加,并将结果作为 weight 列。Queue 表是主查询中的一个表,可能代表着排队队列,它的结构应该包括 person_name(人员名字)、weight(权重值)和 turn(顺序)。另外,(SELECT @pre := 0) tmp 用来初始化 @pre 变量,确保在开始查询时 @pre 的初始值为 0。

  3. 在 MySQL 中,SELECT @pre := 0 这样的语句通常用于在查询开始时初始化一个变量。这个语句在 SQL 中是作为一个子查询(Subquery)来执行的,而且在这种情况下,它将只执行一次。

    当你在一个查询中执行 (SELECT @pre := 0) tmp 时,它不会返回任何行,因为它的作用是初始化 @pre 变量的值为 0,并且不会生成实际的结果集。这样做是为了确保在你主要的查询语句执行之前,@pre 变量已经被赋了初始值 0。

    这个子查询中的别名 tmp 本质上是一个占位符。它没有实际的作用,只是为了使查询语法合法。当你需要在查询开始时初始化变量时,使用这种方法是相对常见的做法。

  4. ORDER BY turn: 这里的 ORDER BY 子句按照 turn 列的值对数据进行排序。turn 可能是一个列,决定了人员排队的顺序。

  5. 外部的主查询 a 使用内部子查询的结果,它选择了所有权重不超过 1000 的人员。这是通过 WHERE a.weight <= 1000 条件实现的,它筛选出总权重不超过 1000 的行。

  6. ORDER BY a.weight DESC: 外部主查询中的 ORDER BY 子句再次对结果进行排序,这次是按照 weight 列的降序排列。

  7. LIMIT 1: 最终结果被限制为仅返回第一个结果行,因为按照降序排列,第一个结果就是权重总和不超过 1000 的最后一个人员。

这个查询的目的是找出排队人员中总权重不超过 1000 的最后一个人,并返回其姓名。

关于变量定义

在 MySQL 中,你可以使用用户自定义变量来存储和处理数据,这些变量的作用域仅限于当前会话,并在会话结束时被清除。以下是 MySQL 中自定义变量的几种常见方法和用法:

1. 使用 SET 命令声明变量:

SET @variable_name = value;

这里 @variable_name 是你自定义的变量名,value 是你想要给变量赋的值。例如:

SET @my_variable = 10;

2. 在 SELECT 语句中设置变量:

SELECT column_name, @variable_name := value AS new_variable_name
FROM your_table;

这个方法允许你在查询中直接给变量赋值。column_name 是你选择的列名,value 是你想要赋给变量的值,AS new_variable_name 则是为变量设置别名(非必须)。例如:

SELECT column_name, @my_variable := column_name * 2 AS doubled_value
FROM your_table;

3. 使用 SELECT INTO 语句设置变量:

SELECT column_name INTO @variable_name
FROM your_table
WHERE condition;

这个语法用于从查询结果中将值赋给变量。例如:

SELECT column_name INTO @my_variable
FROM your_table
WHERE id = 1;

4. 使用用户自定义函数(User-defined Functions):

你还可以通过编写自定义函数来操作变量,并在函数中使用这些变量。

DELIMITER //
CREATE FUNCTION my_function()
RETURNS INT
BEGINDECLARE my_var INT;SET my_var = 10;RETURN my_var;
END //
DELIMITER ;

注意事项:

  • 在 MySQL 中,变量名以 @ 符号作为前缀。
  • 这些用户自定义变量的作用范围是当前会话。它们在会话结束时会被清除。
  • 变量赋值和使用可以在同一查询中进行,但是 MySQL 中变量的使用必须在赋值之后。
  • 变量可以存储数字、字符串和日期等不同类型的值。
  • 在复杂查询中,特别是涉及到事务或存储过程的场景中,变量的使用可以非常有用。

这些是 MySQL 中使用自定义变量的基本方法和一些常见用法。通过灵活地使用这些变量,你可以进行更多复杂的数据处理和操作。

1907. 按分类统计薪水


表: Accounts

+-------------+------+
| 列名        | 类型  |
+-------------+------+
| account_id  | int  |
| income      | int  |
+-------------+------+
在 SQL 中,account_id 是这个表的主键。
每一行都包含一个银行帐户的月收入的信息。

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

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

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

任意顺序 返回结果表。

查询结果格式如下示例。

示例 1:

输入:
Accounts 表:
+------------+--------+
| account_id | income |
+------------+--------+
| 3          | 108939 |
| 2          | 12747  |
| 8          | 87709  |
| 6          | 91796  |
+------------+--------+
输出:
+----------------+----------------+
| category       | accounts_count |
+----------------+----------------+
| Low Salary     | 1              |
| Average Salary | 0              |
| High Salary    | 3              |
+----------------+----------------+
解释:
低薪: 有一个账户 2.
中等薪水: 没有.
高薪: 有三个账户,他们是 3, 6和 8.

题解:

# Write your MySQL query statement below
SELECT 'Low Salary' AS category,SUM(CASE WHEN income < 20000 THEN 1 ELSE 0 END) AS accounts_count
FROM AccountsUNION
SELECT  'Average Salary' category,SUM(CASE WHEN income >= 20000 AND income <= 50000 THEN 1 ELSE 0 END) AS accounts_count
FROM AccountsUNION
SELECT 'High Salary' category,SUM(CASE WHEN income > 50000 THEN 1 ELSE 0 END) AS accounts_count
FROM Accounts

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

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

相关文章

20240104----重返学习-关于`npm --legacy-peer-deps`与`npm --force`升级版本

记–legacy-peer-deps与–force的了解与思考 之前还是旧的版本: "bpmn-js": "^7.3.1","bpmn-js-properties-panel": "^0.37.2","houtaroy-bpmn-js-properties-panel-activiti": "^0.0.1",使用npm install bpmn-js…

力扣(leetcode)第392题判断子序列(Python)

392.判断子序列 题目链接&#xff1a;392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;…

pyfolio工具结合backtrader分析量化策略组合,附源码+问题分析

pyfolio可以分析backtrader的策略&#xff0c;并生成一系列好看的图表&#xff0c;但是由于pyfolio直接install的稳定版有缺陷&#xff0c;开发版也存在诸多问题&#xff0c;使用的依赖版本都偏低&#xff0c;试用了一下之后还是更推荐quantstats。 1、安装依赖 pip install …

车辆运动学方程推导和代码实现

文章目录 1. 运动学方程2. 模型实现 1. 运动学方程 自行车模型&#xff08;Bicycle Model&#xff09;是车辆数字化模型中最常见的一种运动学模型。其除了可以反映车辆的一些基础特性外&#xff0c;更重要的是简单易用。通常情况下我们会把车辆模型简化为二自由度的自行车模型…

游戏Lua调用01.lua的编译及测试

一、lua库下载与编译 进入lua官网 Lua: version history 找到lua5.1 选择lua5.1是因为大部分游戏使用的都是lua5.1的库&#xff0c;也可以选择高版本&#xff0c;影响不大 下载完了后使用vs建立一个静态库或者动态库的工程 这里以动态库为例子&#xff0c;静态库也是一样的…

flink table view datastream互转

case class outer(f1:String,f2:Inner) case class outerV1(f1:String,f2:Inner,f3:Int) case class Inner(f3:String,f4:Int) 测试代码 package com.yy.table.convertimport org.apache.flink.streaming.api.scala.StreamExecutionEnvironment import org.apache.flink.tabl…

w18认证崩溃之暴力破解DVWA

一、实验环境 攻击工具&#xff1a;burpsuite2021.12 靶场&#xff1a;DVWA二、实验目的 演示暴破DVWA的medium和high两个级别&#xff0c;low级别请查看w18认证崩溃之暴力破解4种攻击模式 三、实验步骤 1.设置靶场medium级别 2.开启谷歌代理插件&#xff0c;开启bp拦截&…

AI教我学编程之AI自刀

AI教我学编程系列学习第二课 — C#变量类型 上节回顾知识梳理C#基本变量类型 对话AI分歧产生本段总结 它说得对吗&#xff1f;我随即发问经典AI自刀他来了 总结 上节回顾 在上一节中我们发现&#xff0c;AI工具似乎还不能达到教学的水平&#xff0c;所以在本节中&#xff0c;…

数据在内存中的存储方式

前言&#xff1a; 期末临近&#xff0c;继续复习&#xff01; 今天要复习的内容是数据在内存中的存储&#xff0c;主要是整型与浮点两种&#xff0c;还有大小端的介绍。 提出问题 打印结果是255 -1 为什么&#xff1f; 首先我们要知道数据都是以二进制的形式存…

Spring Framework和SpringBoot的区别

目录 一、前言 二、什么是Spring 三、什么是Spring Framework 四、什么是SpringBoot 五、使用Spring Framework构建工程 六、使用SpringBoot构建工程 七、总结 一、前言 作为Java程序员&#xff0c;我们都听说过Spring&#xff0c;也都使用过Spring的相关产品&#xff0…

uni-app 前后端调用实例 基于Springboot 详情页实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

mysql进阶-重构表

目录 1. 原因 2. 如何重构表呢&#xff1f; 2.1 命令1&#xff1a; 2.2 命令2&#xff1a; 2.3 命令3&#xff1a; 1. 原因 正常的业务开发&#xff0c;为什么需要重构表呢&#xff1f; 原因1&#xff1a;某张表存在大量的新增和删除操作&#xff0c;导致表经历过大量的…

JavaScript异常处理实战

前言 之前在对公司的前端代码脚本错误进行排查&#xff0c;试图降低 JS Error 的错误量&#xff0c;结合自己之前的经验对这方面内容进行了实践并总结&#xff0c;下面就此谈谈我对前端代码异常监控的一些见解。 本文大致围绕下面几点展开讨论&#xff1a; JS 处理异常的方式…

Keil 5 ARMCC编译错误和警告解释大全(2) 序列号1000-2000

1001&#xff1a;由 using 声明指定的类成员必须在直接基类中可见 1003&#xff1a;Sun 模式与 cfront 模式不兼容 1004&#xff1a;严格模式与 Sun 模式不兼容 1005&#xff1a;只有在编译 C 时才允许使用太阳模式 1006&#xff1a; 模板模板参数不能与其模板参数之一同名…

解决 Postman 报错问题:一份综合指南

Postman 是一个流行的 API 测试工具&#xff0c;它可以帮助开发者和测试人员快速地创建和发送各种 HTTP 请求&#xff0c;并查看响应结果。但是&#xff0c;在使用 Postman 的过程中&#xff0c;有时候会遇到一些报错或异常情况&#xff0c;影响了正常的测试流程。本文将介绍一…

图像分割-Grabcut法

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本文的C#版本请访问&#xff1a;图像分割-Grabcut法(C#)-CSDN博客 GrabCut是一种基于图像分割的技术&#xff0c;它可以用于将图像…

上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告

上海东海职业技术学院低代码实训平台建设项目竞争性磋商公告 招标&#xff5c;招标公告 上海市|闵行区 项目编号&#xff1a;0773-2340GNSHFWCS2823 招标单位&#xff1a;上海东海职业技术学院 代理单位&#xff1a;中金招标有限责任公司 预算金额&#xff1a;59万元 联系方式&…

Python:sqlalchemy报错DetachedInstanceError

sqlalchemy 对象commit之后再使用就会报错 DetachedInstanceError既然这样&#xff0c;提交后还需要使用&#xff0c;就拷贝一个副本出来 一个思路是 # -*- coding: utf-8 -*- """ File : sqlalchemy_util.py Date : 2024-01-07 Author : Peng Shiyu …

循环队列的队空队满情况

有题目&#xff1a; 循环队列放在一维数组A[0....M-1]中&#xff0c;end1指向队头元素&#xff0c;end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作&#xff0c;队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中&#xff0c;正确的是 …

vim/vi 模式切换和常用快捷键

vim/vi 切换模式&#xff1a; vim/vi 常用快捷键&#xff1a; 一般模式&#xff1a; gg&#xff1a;文件开头、G&#xff1a;文件结尾 shift^ &#xff1a;光标当前行首、shift^&#xff1a;光标当前行尾 yy&#xff1a;复制、p&#xff1a;粘贴、dd&#xff1a;删除当前行、…