601.体育馆的人流量
X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (date)、 人流量 (people)。
请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。
例如,表 stadium:
id | date | people |
---|---|---|
1 | 2017-01-01 | 10 |
2 | 2017-01-02 | 109 |
3 | 2017-01-03 | 150 |
4 | 2017-01-04 | 99 |
5 | 2017-01-05 | 145 |
6 | 2017-01-06 | 1455 |
7 | 2017-01-07 | 199 |
8 | 2017-01-08 | 188 |
对于上面的示例数据,输出为:
id | date | people |
---|---|---|
5 | 2017-01-05 | 145 |
6 | 2017-01-06 | 1455 |
7 | 2017-01-07 | 199 |
8 | 2017-01-08 | 188 |
Note:
每天只有一行记录,日期随着 id 的增加而增加。
三个stadium表,使用TO_DAYS做判断,输出三种情况下的s1信息
①s1, s2, s3
②s2, s1, s3
③s2, s3, s1
但是这道题有问题,领扣上的正确样例中,时间并不是以绝对时间连续,即不是一号二号三号这样判断,而是使用表中id记录为准,只要三个连续记录之间满足均大于100,就需要输出
正确理解代码(无法AC)
SELECT DISTINCT s1.id, s1.date, s1.people -- 选取不同的s1
FROM stadium s1, stadium s2, stadium s3
WHERE -- 三种排序可能
( -- 以date的日期为准,找到昨天 今天 明天
( -- s1 s2 s3
TO_DAYS(s2.date) = TO_DAYS(s1.date) + 1
AND TO_DAYS(s3.date) = TO_DAYS(s1.date) + 2
)
OR ( -- s2 s1 s3
TO_DAYS(s1.date) = TO_DAYS(s2.date) + 1
AND TO_DAYS(s3.date) = TO_DAYS(s2.date) + 2
)
OR ( -- s2 s3 s1
TO_DAYS(s3.date) = TO_DAYS(s2.date) + 1
AND TO_DAYS(s1.date) = TO_DAYS(s2.date) + 2
)
)
AND s1.people >= 100 -- 均大于100
AND s2.people >= 100
AND s3.people >= 100
ORDER BY s1.id -- 以s1为序
可以AC代码
SELECT DISTINCT s1.id, s1.date, s1.people -- 选取不同的s1
FROM stadium s1, stadium s2, stadium s3
WHERE -- 三种排序可能
( -- 以id为准,找到最小的id,id+1,id+2
( -- s1 s2 s3
s1.id + 1 = s2.id
AND s1.id + 2 = s3.id
)
OR ( -- s2 s1 s3
s2.id + 1 = s1.id
AND s2.id + 2 = s3.id
)
OR ( -- s2 s3 s1
s2.id + 1 = s3.id
AND s2.id + 2 = s1.id
)
)
AND s1.people >= 100 -- 均大于100
AND s2.people >= 100
AND s3.people >= 100
ORDER BY s1.id -- 以s1为序
620.有趣的电影
某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。
作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。
例如,下表 cinema:
id | movie | description | rating |
---|---|---|---|
1 | War | great 3D | 8.9 |
2 | Science | fiction | 8.5 |
3 | irish | boring | 6.2 |
4 | Ice song | Fantacy | 8.6 |
5 | House card | Interesting | 9.1 |
对于上面的例子,则正确的输出是为:
id | movie | description | rating |
---|---|---|---|
5 | House card | Interesting | 9.1 |
1 | War | great 3D | 8.9 |
原样输出,所以SELECT *
筛选条件一:不为boring
筛选条件二:id为奇数
筛选条件三:按rating排序
SELECT *
FROM cinema
WHERE description != 'boring'
AND mod(id,2) = 1
ORDER BY rating DESC
626.换座位
小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id。
其中纵列的 id 是连续递增的
小美想改变相邻俩学生的座位。
你能不能帮她写一个 SQL query 来输出小美想要的结果呢?
示例:
id | student |
---|---|
1 | Abbot |
2 | Doris |
3 | Emerson |
4 | Green |
5 | Jeames |
假如数据输入的是上表,则输出结果如下:
id | student |
---|---|
1 | Doris |
2 | Abbot |
3 | Green |
4 | Emerson |
5 | Jeames |
注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
两两交换,采用union分成三种情况处理
SELECT s.id, s.student
FROM(
-- 偶数位置 seat1为偶数位,seat2 = seat1-1为对应的奇数位
SELECT seat1.id, seat2.student
FROM seat seat1, seat seat2
WHERE seat1.id = seat2.id + 1
AND MOD(seat1.id, 2) = 0
UNION
-- 奇数非末尾 seat1为偶数位,seat2 = seat1-1为对应的奇数位
SELECT seat2.id, seat1.student
FROM seat seat1, seat seat2
WHERE seat1.id = seat2.id + 1
AND MOD(seat1.id, 2) = 0
-- count(*)为计算总条目数
AND seat2.id != (SELECT COUNT(*) FROM seat)
UNION
-- 奇数末尾 判断是否存在奇数末尾
SELECT *
FROM seat
WHERE id = (SELECT COUNT(*) FROM seat)
AND MOD(id, 2) = 1
) s
ORDER BY s.id -- 按最终的id排序
627.交换工资
给定一个 salary表,如下所示,有m=男性 和 f=女性的值 。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
例如:
id | name | sex | salary |
---|---|---|---|
1 | A | m | 2500 |
2 | B | f | 1500 |
3 | C | m | 5500 |
4 | D | f | 500 |
运行你所编写的查询语句之后,将会得到以下表:
id | name | sex | salary |
---|---|---|---|
1 | A | f | 2500 |
2 | B | m | 1500 |
3 | C | f | 5500 |
4 | D | m | 500 |
这题不应该叫交换工资,应该叫交换性别。
使用case when做判断,如果是f变成m,如果是m变成f
直接update更新一下salary表即可
参考资料《【LeetCode】627.交换工资》
-- 采用IF(A,B,C)的形式,相当于一个三目
UPDATE salary
SET sex = IF((sex = 'm'), 'f', 'm')
-- 采用CASE WHEN A THEN B ELSE C END,就是个三目
UPDATE salary
SET sex = (CASE WHEN sex = 'm' THEN 'f' ELSE 'm' END)
网友评论