sql - VERTICA:如何创建循环
问题描述
我正在尝试根据用 SAS 编写的示例在 Vertica 中创建一个循环。
我怎样才能做到这一点?
do i = 1 to 24;
if 3 <= 24 - (intck('MONTH', &startdate, datepart(accountopeneddate))) - i + 1 <= 24
then stat[i] = status[24 - (intck('MONTH', &startdate, datepart(accountopeneddate))) - i + 1];
else stat[i] = '';
end;
run;
解决方案
Vertica 是一个普通的 SQL 数据库。SQL 没有循环,这通常是一个优势。此外,SQL 没有数组,没有变量,也没有办法将任何东西分配给任何东西。
您最多可以创建一个包含与数组元素一样多的行的表。
如果你的status[]
数组有 24 个元素,你可以去:
\set startdate '''2019-01-01'''
DROP TABLE IF EXISTS show;
CREATE TABLE show AS
WITH
status_tb(i,status) AS (
SELECT 1,'unrevised draft'
UNION ALL SELECT 2,'1st revised draft'
UNION ALL SELECT 3,'2nd revised draft'
UNION ALL SELECT 4,'3rd revised draft'
UNION ALL SELECT 5,'4th revised draft'
UNION ALL SELECT 6,'5th revised draft'
UNION ALL SELECT 7,'6th revised draft'
UNION ALL SELECT 8,'7th revised draft'
UNION ALL SELECT 9,'8th revised draft'
UNION ALL SELECT 10,'9th revised draft'
UNION ALL SELECT 11,'1st rejected draft'
UNION ALL SELECT 12,'2nd rejected draft'
UNION ALL SELECT 13,'3rd rejected draft'
UNION ALL SELECT 14,'4th rejected draft'
UNION ALL SELECT 15,'5th rejected draft'
UNION ALL SELECT 16,'6th rejected draft'
UNION ALL SELECT 17,'7th rejected draft'
UNION ALL SELECT 18,'8th rejected draft'
UNION ALL SELECT 19,'9th rejected draft'
UNION ALL SELECT 20,'1st approved version'
UNION ALL SELECT 21,'2rd approved version'
UNION ALL SELECT 22,'3th approved version'
UNION ALL SELECT 23,'4th approved version'
UNION ALL SELECT 24,'5th approved version'
)
,
account(accountopeneddate) AS (
SELECT '2019-08-15'::DATE
)
SELECT
i.i
, status
, DATEDIFF(MONTH,:startdate,accountopeneddate) AS mth_btw
FROM account CROSS JOIN (SELECT i FROM status_tb) i
LEFT JOIN status_tb
ON
CASE
WHEN DATEDIFF(MONTH,:startdate,accountopeneddate) - i.i + 1 BETWEEN 3 AND 24
THEN DATEDIFF(MONTH,:startdate,accountopeneddate) - i.i + 1
ELSE NULL
END = status_tb.i
;
SELECT * FROM show ORDER BY 1;
-- out DROP TABLE
-- out Time: First fetch (0 rows): 7.469 ms. All rows formatted: 7.496 ms
-- out CREATE TABLE
-- out Time: First fetch (0 rows): 81.812 ms. All rows formatted: 81.824 ms
-- out i | status | mth_btw
-- out ----+-------------------+---------
-- out 1 | 6th revised draft | 7
-- out 2 | 5th revised draft | 7
-- out 3 | 4th revised draft | 7
-- out 4 | 3rd revised draft | 7
-- out 5 | 2nd revised draft | 7
-- out 6 | | 7
-- out 7 | | 7
-- out 8 | | 7
-- out 9 | | 7
-- out 10 | | 7
-- out 11 | | 7
-- out 12 | | 7
-- out 13 | | 7
-- out 14 | | 7
-- out 15 | | 7
-- out 16 | | 7
-- out 17 | | 7
-- out 18 | | 7
-- out 19 | | 7
-- out 20 | | 7
-- out 21 | | 7
-- out 22 | | 7
-- out 23 | | 7
-- out 24 | | 7
推荐阅读
- swift - 为什么 TypeScript 接受不使用“?” 如果对象是可选的,则运算符?
- visual-studio - 在解决方案资源管理器中查找从项目中排除的 CPP 文件需要帮助
- python - 如何对名词进行词形还原?
- java - 如何在 Java 中使图像的矩形部分变暗?
- node.js - 在 node.js 中,IP 地址不断变化。但我认为本地计算机 IP 地址是不变的
- json - 使用命令的输出在 bash 中创建 JSON 对象以脱颖而出
- apache2 - Certbot 无法在子域中正常工作
- reactjs - 最佳实践:使用 setState 或 dispatch 的 useEffect 依赖,通过 useContext 或自定义钩子
- html - 为什么将haml代码转换为html不起作用
- python - 通过systemd运行时openssl证书验证失败