ChatGPT 提高工作效率-一例SQL编写的过程

发布时间 2023-05-16 23:01:46作者: 济南小老虎

ChatGPT 提高工作效率-一例SQL编写的过程


前言

遇到一个问题, 怀疑是有一些补丁没有被依赖. 
导致第一次更新时没有更新这些没依赖的补丁. 
后面更新时又更新了这些游离态的补丁.
导致出现 old 文件 覆盖 new 文件
出现程序问题. 
一个补丁还好着, 但是所有的补丁去检查就比较麻烦了.
所以想写出一个SQL来.
问题是 此处设计到了 3张表, 
一张信息表, 一张依赖关系表, 一张发布时间表
自己SQL能力非常菜鸡. 所以在贵文老师的帮助下使用了ChatGPT提高了编写效率.
所以想记录一下. 科学技术的确是生产力

思路

1. 主要是要获取所有模块最后一个发布的补丁列表
2. 查询所有没有被依赖信息的已发布补丁信息.
3. 基于2再删除1的结果, 获取如下内容:

不是该模块最后一个已发布, 并且没有依赖关系的补丁

ChatGPT的讲解

考虑到上一步的场景1 
应该需要使用窗口函数进行查询
但是自己的窗口函数处理能力基本上等于 0 语法都不熟悉
所以打开如下网站:https://chat.aidutu.cn/

我问的: 
SQLSERVER 查询 多分组情况下 每个分组的最后一个记录

ChatGPT答复的

您可以使用子查询和窗口函数来实现按多个分组列对结果进行分组,并且获取每个分组的最后一个记录。下面是一种可能的解决方案:

sql
SELECT *
FROM (
  SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY id DESC) as rn
  FROM your_table
) t
WHERE rn = 1;

基于ChatGPT的讲解编写自己的SQL

解释:

首先在 FROM 子句中使用子查询,以便在内部查询中计算每个分组的最后一个记录。这个查询返回以下列:

col1、col2 和所有你需要的其他列,作为 GROUP BY 的参数。
id,作为分组内的排序列,并按降序排列,意味着第一行就是最后一行。
将这个子查询封装在外面的 SELECT 语句中,它过滤了每个分组中只包含 ID 最大的行。如果某个分组有多个相同的 ID,则该查询将返回其中任何一个。
总之,这个查询将返回每个分组的最后一个记录,即每个不同于其它分组的唯一组合。

自己编写的SQL就为:
    SELECT
     patchcode 
    FROM
     xxxx.patchinfo 
    WHERE
     patchid NOT IN ( SELECT deppatchid FROM xxxx.patchdepinfo ) 
     AND patchstate = 'PUBLISHED' 
     AND patchid NOT IN (
     SELECT
      patchid 
     FROM
      (
      SELECT
       *,
       ROW_NUMBER ( ) OVER ( PARTITION BY patchmodule ORDER BY publishtime DESC ) AS rn 
      FROM
       (
       SELECT
        a.patchid,
        a.patchcode,
        a.patchmodule,
        b.publishtime 
       FROM
        LCBM9999.patchinfo a
        INNER JOIN LCBM9999.PATCHPUBLISHED b ON a.patchid = b.patchid 
       ) w 
      ) t 
     WHERE
     rn = 1 
     ) order by patchcode asc 

感想

ChatGPT 的确是生产力工具
能够让我这种SQL菜鸡实现一定程度的高级SQL编写能力. 

感觉的确会对IT数从业人员产生巨大的挑战.  
需要不停的学习. 比机器人更能思考,更能创造价值才可以利于不败之地. 

学会的东西可能明天就是废纸了. 但是必须得有获取新知识,新方向的能力.