将递归/循环 Excel 逻辑转换为 SQL 语法
Posted
技术标签:
【中文标题】将递归/循环 Excel 逻辑转换为 SQL 语法【英文标题】:Transfer Recursive/Circular Excel Logic to SQL Syntax 【发布时间】:2021-07-08 14:50:12 【问题描述】:问题描述
我有一个问题,我想将一些 Excel/GSheet 逻辑 转换为标准 SQL 语法:
具有布尔值的三个条件:cond_1
、cond_2
、cond_3
final_flag
列应遵循与 SQL 相同的 Excel 逻辑
问题在于,在 Excel 中,M2
中的第一个值被静态/手动设置为 False
硬编码值示例:
随后的单元格M3
等随后使用一些逻辑进行计算:=if(L3,false,if(K3,false,or(J3,M2)))
计算最终逻辑的公式:
最初的想法
困难的部分是在 SQL 中引用已计算的单元格 (or (J3,M2)
),其中第一个单元格是硬编码值
这似乎需要一种在 SQL 中难以复制的递归逻辑
这里是一个带有逻辑示例数据的链接:Google Sheet
如果您有任何提示或什么 SQL 语法可以解决这个问题,请告诉我!谢谢:)
【问题讨论】:
在问题中包含示例数据和期望的结果作为文本表是一个很大的帮助——作为对你的逻辑应该做什么的解释。 分享您的工作表副本以及所需结果的示例 您并没有真正解释 J、K 和 L 的来源。如果它们是外部的,当您转换为 SQL 时,它们会在表中吗?是什么让 M3 与 M2 建立了关系?在 SQL 中,您需要通过排序属性对其进行实例化,即使它只是 1、2、3 序列。 SQL 数据集(表和结果集)没有内在的排序属性。如果您可以回答这些问题,那么为您提供答案应该相对简单——甚至可能无需递归。 取决于标准 SQL 的含义 - SQL Server 2012 中存在超前和滞后功能,这可能会有所帮助 mssqltips.com/sqlservertutorial/9127/… 我在问题中添加了链接docs.google.com/spreadsheets/d/…,您可以在其中看到公式和所需的结果:) 我希望这有助于更多地解释我想要完成的事情! 【参考方案1】:我通过sqlfiddle 创建了一个可在 MS SQL Server 2017 上运行的递归 cte。
这是我的架构:
CREATE TABLE Test(
row_ID int IDENTITY(1,1) PRIMARY KEY,
cond_1 bit,
cond_2 bit,
cond_3 bit,
final_flag bit
);
-- I placed an initial false into the first row
INSERT INTO Test(cond_1, cond_2, cond_3, final_flag)
VALUES
(0, 0, 1, 0)
;
INSERT INTO Test(cond_1, cond_2, cond_3)
VALUES
(1, 0, 0),
(0, 1, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(1, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 1),
(1, 0, 0),
(0, 1, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0),
(1, 0, 0),
(0, 0, 0),
(0, 0, 0),
(0, 0, 0);
表:
查询:
WITH cte AS (
-- anchor query
SELECT row_ID, cond_1, cond_2, cond_3, final_flag
FROM Test
WHERE row_ID = 1
UNION ALL
-- recursive query
SELECT This.row_ID, This.cond_1, This.cond_2, This.cond_3,
cast(case when This.cond_3|This.cond_2 = 1 then 0
else This.cond_1|Prev.final_flag
end as bit) as final_flag
FROM Test This, cte Prev
WHERE This.row_id = Prev.row_id + 1
)
SELECT cond_1, cond_2, cond_3, final_flag FROM cte;
输出:
注意:
我添加了一个row_ID
列,以便于比较。您始终可以在输出中排除它们。
您可能已经注意到我的最终标志计算与您的有点不同。我将您的公式 =if(L3,false,if(K3,false,or(J3,M2)))
简化为 =IF(OR(K3,L3),FALSE,OR(M2,J3))
,因此我只能使用 1 个 case
语句,进一步简化了整个查询。
结果未写入到表中。随意根据输出更新表格。
更多详情,请阅读recursive sql queries using ctes。递归 sql 查询对我来说是非常新的东西,只需阅读该博客就可以使用它。
【讨论】:
以上是关于将递归/循环 Excel 逻辑转换为 SQL 语法的主要内容,如果未能解决你的问题,请参考以下文章