数据库专题四

2018-10-10  本文已影响0人  闭门造折

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)
上一篇 下一篇

猜你喜欢

热点阅读