平时写出这份 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