栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

SQL练习:表妹不在,没人帮我查表,只好自己来了

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SQL练习:表妹不在,没人帮我查表,只好自己来了

前言

公司的表妹休假了,这下找谁给我查表啊,没辙,只能亲自上阵了。哎?等等,表妹留下了脚本让我执行,但写的好像不怎么样嘛,我这该死的好胜心,这波非要班门弄斧一下!先来看看需求:

以脱敏数据为例,对 tp 重新归类,原本是 a、aa、b、c、d、dd 六类,先变成 A、b、c、D 四类,并分不同时间段计数,且按指定的新分类顺序 bADc 排序。这个需求源于工作中用到一个 excel 数据模板,格式固定,所以需要查出来的数据能直接复制粘贴到模板表里。应该怎么做呢?

一、表妹的做法

话不多说,直接先看表妹的操作。首先在子查询中通过 where 筛选本期时间段内数据,再利用 case when 对原类别重新归类,对每个新类所在列取个别名,便于下一步计数(子查询结果见下图)。如此再复刻一个不选时间的总体数据后,通过 union all 上下拼接。

但是最终结果却不是目标格式,这样还要在 excel 粘贴时行列转置,这不是阻止我偷懒嘛!

二、我的做法

我一气之下就要改表妹的脚本,常规思路,上下拼接不对,那就换左右拼接。于是一拍脑袋就想到 left join。一番百度后,洋洋洒洒的代码就出炉了,先分类,再分组统计,再排序,左表哦了;又分类,筛时间,再分组,右表哦了~合体,将将!我太牛啦!

三、综合改进

正沾沾自喜之时惊觉,这代码量也太累赘了吧!秉承派森尼克思想,要追求优雅的、地道的、整洁的代码,必须改进!奈何基础不扎实,百度也救不了,经大佬提示后才发现可以不用 where 来选时间段呀!还是先分类分组,然后直接利用 case when 对时间分别标记后计数,好嘞,再来,将将!

最后要提的一个知识点就是按指定类别排序,在 MYSQL 中可以利用 order by field(t, 'b', 'A', 'D', 'c') 指定,而在 SQLite 和 SQL Server 中却不支持,可用 case when 再造一个序列表辅助排序。以上脚本均在 MYSQL 中执行通过,可复制下方数据进行尝试,欢迎大佬指出错误和提供更优解。

tpday
a2020-09-02 16:15:20.000
a2020-09-03 16:15:20.000
aa2020-09-04 16:15:20.000
b2020-09-05 16:15:20.000
b2020-09-06 16:15:20.000
c2020-09-07 16:15:20.000
c2020-09-08 16:15:20.000
c2020-09-09 16:15:20.000
c2020-09-10 16:15:20.000
d2020-09-11 16:15:20.000
dd2020-09-12 16:15:20.000
dd2020-09-13 16:15:20.000
a2020-09-14 16:15:20.000
b2020-09-15 16:15:20.000
c2020-09-16 16:15:20.000
结语

习惯了 Python 简洁流畅的语法后,写 SQL 总是转不过弯,这次借着工作实操的机会复习了一下基础,这里是还给老师后又企图复习的 Seon塞翁,话说,SQL 其实就是 Search Question Limply (无力地寻找问题)吧,下一篇见!顺便附上 Python 解法。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037039.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号