在某个群组看到了一个题目,心想,哎,这不才看完极客时间的 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条评论