将递归/循环 Excel 逻辑转换为 SQL 语法

Posted

技术标签:

【中文标题】将递归/循环 Excel 逻辑转换为 SQL 语法【英文标题】:Transfer Recursive/Circular Excel Logic to SQL Syntax 【发布时间】:2021-07-08 14:50:12 【问题描述】:

问题描述

我有一个问题,我想将一些 Excel/GSheet 逻辑 转换为标准 SQL 语法

具有布尔值的三个条件:cond_1cond_2cond_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 语法的主要内容,如果未能解决你的问题,请参考以下文章

您如何将其转换为迭代函数而不是使用嵌套循环进行递归?

Python 3.3 如何将此递归函数转换为纯 yield 循环版本?

如何将Excel数据转换为SQL脚本

如何将Excel数据转换为SQL脚本

将 Excel 工作表转换为 PDF,无限循环错误

将存储过程从 MS SQL Server 转换为 Informix