VERTICA:如何创建循环

问题描述 投票:0回答:2

我正在尝试根据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;
sql loops sas vertica
2个回答
0
投票

使用Vertica SQL语法是不可能的。

您的两个选择是以您选择的语言(Using User-Defined Extensions)创建UDx,或者让与Vertica交互的任何应用程序都为您处理逻辑。


0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.