暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

书中隐藏的 SQL 开窗函数秘密,ChatGPT 找到了

有关SQL 2023-05-30
258

平时写出这份 T-SQL 的开窗函数脚本,大多数开发者都会引以为傲了:

    SELECT empid, ordermonth, qty, 
    SUM(qty) OVER (PARTITION BY empid
    ORDER BY ordermonth
    ROWS BETWEEN UNBOUNDED PRECEDING
    AND CURRENT ROW) AS run_sum_qty,
    AVG(qty) OVER (PARTITION BY empid
    ORDER BY ordermonth
    ROWS BETWEEN UNBOUNDED PRECEDING
    AND CURRENT ROW) AS run_avg_qty,
    MIN(qty) OVER (PARTITION BY empid
    ORDER BY ordermonth
    ROWS BETWEEN UNBOUNDED PRECEDING
    AND CURRENT ROW) AS run_min_qty,
    MAX(qty) OVER (PARTITION BY empid
    ORDER BY ordermonth
    ROWS BETWEEN UNBOUNDED PRECEDING
    AND CURRENT ROW) AS run_max_qty
    FROM Sales.EmpOrders;


    复制

    知道开窗函数能解决很多有趣的问题,比如排名,排班,去重等等。但很多场景,也不是都有机会去体验

    所以更多的,开窗函数对于开发者来说,是个神秘的武器。能有机会写出上面的脚本,所在的领域和数字交易一定结合得非常紧密,电商,银行,证券

    但是,作为数据分析师,ETLer, 这些再普通不过,甚至是必备技能,仅仅满足写出来,未免对自己要求有点低。

    怎么去优化,写得更有调理,更简洁,始终要放在备忘录里

    可,上面的 SQL 还要怎么优化呢,怎么写得更简洁呢?其实我也不知道。直到今天,我尝试用 AskYourPDF 这么一款 ChatGPT Plugin 我才恍然一悟

    说起 T-SQL 开窗函数,那就不得不提这本书《

    microsoft-sql-server-2012-high-performance-t-sql-using-window-functions


    你要买的话,一定认准了,作者是 Ben 大叔

    我拿到这本书的 PDF 版本,想着页数不多,要不请 ChatGPT 帮我读一读。于是我就裁剪了第一章,丢给 AskYourPDF

    有个前提,AskYourPDF 是个阅读 PDF 的插件,它的极致能支持 200页 PDF, 所以我首先用一款免费的在线分割 PDF 软件,将它第一章给切下来:

    注意,这里极力推荐这款软件,它是免费的,网址在这里:

    https://www.ilovepdf.com

    接着,我把这份切割好的 PDF,上传到 AskYourPDF 官网

    官网:https://askyourpdf.com/upload

    前面我试过 ChatWithPDF, 好用是好用:

    如何用 ChatGPT 帮你10分钟读完数据库论文 <- 戳它了解

    但如果我要用本地文件,就比较抓狂,需要把 PDF 上传到一个可以被 ChatGPT 访问到的地方,试过很多服务,都不行

    最终还是自带接收 PDF 的 AskYourPDF 。把 PDF 上传,记住 上图中 2 标注的文档 ID。在与 ChatGPT 对话时,告诉它这个 ID,即可:

    别忘记启用 AskYourPDF 插件

    我请 ChatGPT 总结这一章的内容,于是就出现了开头的例子。

    我注意到总结时,它说到“窗口定义的重用”,我就很好奇,追问下去,它给出了文档中的例子:

    最终,代码是这样的:



      SELECT empid, ordermonth, qty,
      SUM(qty) OVER W1 AS run_sum_qty,
      AVG(qty) OVER W1 AS run_avg_qty,
      MIN(qty) OVER W1 AS run_min_qty,
      MAX(qty) OVER W1 AS run_max_qty
      FROM Sales.EmpOrders
      WINDOW W1 AS ( PARTITION BY empid
      ORDER BY ordermonth
      ROWS BETWEEN UNBOUNDED PRECEDING
      AND CURRENT ROW );


      复制

      是不是看着舒服多了?

      求证下 SQL Server 官网:

      确有此语法,但需将 SQL Server 兼容性级别提到 160


      文章转载自有关SQL,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论