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

Picture1png
写 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。