SQL 过两月看不懂了咋弄?AI 来了也没用

当初写的两百行 SQL,两个月后自己都看不懂了。偏偏又来了新需求,硬着头皮回去读——这个 JOIN 为什么这么写?那个 CASE 的逻辑是什么?注释也有,还是看不懂。
不改?需求卡在这。改?改一处怕崩三处。这是真的痛。
用 AI 写呢?费劲写好审完把 SQL 拿走用,和 AI 的对话早不知道到哪里去了,结果还是看不懂。
就算能翻出原对话,让 AI 再改也不行。随便提点需求,改完又是一大坨,还得重审核再调试,这和写新的没区别。
那还能咋办?
用 SQLazy!
把 SQL 拆成可读的步骤来写,不记 SQL,只记步骤:
t1=tb: 排序 account_id, start_date
t2=计算列 end_date[:-1], 最大, 命名 prev_max; 分区 account_id
t3=分段 条件 start_date>prev_max 命名 gid; 分区 account_id
t4=汇总 start_date 最小 命名 start_date, end_date 最大 命名 end_date; 分组 account_id, gid
每行一步,大白话写逻辑,两个月后回来看,还是一秒读懂。中间结果随时可查,改哪里都心里有数。
那 SQL 呢?临时编译出就行,同样的步骤输出永远一样:
WITH t2 AS (
SELECT account_id, start_date, end_date
, MAX(end_date) OVER (PARTITION BY account_id ORDER BY CASE
WHEN account_id IS NULL THEN 1
ELSE 0
END, account_id ASC, CASE
WHEN start_date IS NULL THEN 1
ELSE 0
END, start_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prev_max
FROM t1
)
SELECT MAX(end_date) AS end_date, MIN(start_date) AS start_date, account_id
FROM (
SELECT account_id, start_date, end_date, prev_max
, 1 + SUM(CASE
WHEN start_date > prev_max THEN 1
ELSE 0
END) OVER (PARTITION BY account_id ORDER BY CASE
WHEN account_id IS NULL THEN 1
ELSE 0
END, account_id ASC, CASE
WHEN start_date IS NULL THEN 1
ELSE 0
END, start_date ASC) AS gid
FROM t2
) t_4
GROUP BY account_id, gid
ORDER BY account_id, gid
还想换个库?简单,就重新编译一下的事。
SQL 过两月看不懂?不该是常态。SQLazy,让代码永远可读。
