SQLazy:用自然语言写出复杂 SQL

写 SQL,最怕的不是语法,是复杂度。需求一复杂,SQL 就失控——CTE 套 CTE,窗口函数叠窗口函数,几十行代码揉成一团。错了?改一处崩三处。
有人说不就是 SQL 吗,学学就完了。可问题不在于会不会写,在于写出来的东西,自己过两个月还认不认得,别人接不接得了。
用 SQLazy:把复杂需求用自然语言一层层拆开,每步都像白话一样容易懂。
t1=tb: 排序 timestamp
t2=分段 value; 变化; 命名 gid
t3=汇总 timestamp 首位 命名 effective_from, id 首位 命名 id; 分组 gid, value
t4=计算列 ifn(effective_from[1],datetime("9999-12-31 00:00:00")), 命名 effective_to
不在乎 SQL 方言,逻辑说清楚了就行。每一步独立调试,中间结果随时可查,改哪里都心里有数。
编译出 SQL,直接放数据库里跑:
WITH Value AS (
SELECT id, value, timestamp
FROM events
),
Value2 AS (
SELECT gid, id AS id, value AS value, timestamp AS effective_from
FROM (
SELECT id, value, timestamp
, SUM(CASE
WHEN value <> col__5 THEN 1
ELSE 0
END) OVER (ORDER BY CASE
WHEN timestamp IS NULL THEN 1
ELSE 0
END, timestamp ASC) + 1 AS gid
FROM (
SELECT Value.*, LAG(value) OVER (ORDER BY CASE
WHEN timestamp IS NULL THEN 1
ELSE 0
END, timestamp ASC) AS col__5
FROM Value
) sub__6
) Value1
GROUP BY gid
)
SELECT gid, id, value, effective_from
, LEAD(effective_from, 1, TO_DATE('9999-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) OVER (ORDER BY gid) AS effective_to
FROM Value2
ORDER BY gid;
同样的描述,生成多库 SQL。点一下,MySQL、PG、Oracle 随便切。一次写对,到处能跑。
复杂 SQL,不该是一团乱麻。SQLazy,用自然语言写出复杂 SQL。
