sql - 将递归/循环 Excel 逻辑转换为 SQL 语法
问题描述
问题描述
我有一个问题,我想将一些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)))
计算最终逻辑的公式:
第一个想法
- 困难的部分是引用
or (J3,M2)
SQL 中已经计算的单元格 (),其中第一个单元格是硬编码值 - 这似乎需要一种难以在 SQL 中复制的递归逻辑
这是带有逻辑的示例数据的链接:Google Sheet
如果您有任何提示或 SQL 的语法可以解决这个问题,请告诉我!谢谢 :)
解决方案
我通过 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
语句,进一步简化了整个查询。 - 结果不写入表中。随意根据输出更新表格。
- 有关更多详细信息,请阅读使用 ctes 的递归 sql 查询。递归 sql 查询对我来说是非常新的,只需阅读该博客即可使其工作。
推荐阅读
- python - 基于键的两个字典列表的交集
- github-api - 我怎样才能得到任何号码的问题?
- java - 使用超类/子类引用 JAVA 引用新对象
- android - 如何从kotlin的地图中获取值?
- java - 将鼠标悬停在Java AWT中的按钮上时的手形光标
- machine-learning - 如何建立数以百万计的个性化模型
- android - 如何在 xyz 轴上旋转图像以及 android 中的手机传感器
- css - 如何将 hdp 文件加载为背景图像
- java - Java在if else循环后设置值在一行中
- javascript - ng-show,ng-hide 在控制器外不起作用