• 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 解法。
    在这里插入图片描述

  • 相关阅读:
    C++高级面试题:解释 C++ 中的行为参数化(Behavioral Parameterization)
    如何看待时间序列与机器学习?
    Markdown基础教程
    Java工具——Eclipse设置字体大小
    vue使用样式渗透/deep/ :deep() :global()
    类模板Array带二个模板参数
    初识Redis
    云计算基础-计算虚拟化-CPU虚拟化
    select在socket中的server多路复用
    【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)
  • 原文地址:https://blog.csdn.net/zohan134/article/details/126235455