抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

记一道 sql 编程题的解决方案

在某个群组看到了一个题目,心想,哎,这不才看完极客时间的 SQL 必知必会嘛,看看记得多少。啪啪打脸。

SQL 是面向过程的,于是我就写啊写,写了这么个玩意儿。

SELECT
Dep_id,
(CASE Dep_id = 1
WHEN
(SELECT sales FROM Deps WHERE Dep_id=1 AND year =2017 ) >=
(SELECT sales FROM Deps WHERE Dep_id=1 AND year =2018 )
AND
(SELECT sales FROM Deps WHERE Dep_id=1 AND year =2018 ) >=
(SELECT sales FROM Deps WHERE Dep_id=1 AND year =2019 )
THEN '1'ELSE '0'
END
) AS flag
FROM
Deps GROUP BY Dep_id

但是这个 id 怎么动态起来呢,试了很久不知道。然后某群友又给了一个方案:

SELECT t1.Dep_id, t1.sales/t2.sales as ratio FROM Deps t1 JOIN Deps t2
on t1.Dep_id = t2.Dep_id AND t1.year = t2.year+1

然后说,MIN(radio)小于1的就是不连续的,再 Group By 一下就好了,我试了下确实是这个逻辑,但是 MySQL8.0没法让我继续尝试了,因为模式是only_full_group_by,不愿去折腾,想必会有更专业的解法。

第二天,最后一个群友给出了一个答案:

SELECT
Dep_id,
(CASE WHEN
SUM(CASE WHEN year = 2019 THEN sales ELSE 0 END) > SUM(CASE WHEN year = 2018 THEN sales ELSE 0 END)
AND
SUM(CASE WHEN year = 2018 THEN sales ELSE 0 END) > SUM(CASE WHEN year = 2017 THEN sales ELSE 0 END)
THEN 1 ELSE 0 END) AS flag
FROM Deps
GROUP BY Dep_id

运行了一下,是想要的答案没错了。解析一下,这题的框架是这样的:

SELECT
Dep_id,
(CASE 表达式
THEN 1 ELSE 0 END) AS flag
FROM Deps
GROUP BY Dep_id

就在于表达式怎么写,看看答案的表达式:

WHEN
SUM(CASE WHEN year = 2019 THEN sales ELSE 0 END) > SUM(CASE WHEN year = 2018 THEN sales ELSE 0 END)
AND
SUM(CASE WHEN year = 2018 THEN sales ELSE 0 END) > SUM(CASE WHEN year = 2017 THEN sales ELSE 0 END)

SUM 作用这里相当于计数,最后就是表达一个类似 WHEN 1>0 AND 1>0

此时就是一个完整的条件,不错的答案,比我强太多了,毕竟别人是专业的,专业之所以是专业~ 同时也证明,我是打酱油的,4年了,没写过啥 SQL,知识也是九霄云外去了。

这道题拓开了一道门,让我意识到,后面的 CASE WHEN 原来可以直接用当前这个情况的下的数据。长见识了~


0条评论

发表评论