运行 Vertica 中的递归查询
Running recursive query in Vertica
我正在尝试做与 this question 完全相同的事情。但我在 Vertica,我找不到执行最佳答案或其他答案的方法。所以基本上我已经尝试了 connect by 和子查询 UNION ALL 方法,我认为 Vertica 不支持它。
有什么方法可以在 Vertica 中复制该解决方案?
编辑:完整问题
我正在尝试计算 30 天再入院链,这是从上次入院后 30 天内的一系列再入院。以下数据显示了一个简化的情况,我们有事件,而不是入院和出院。事件之间的天数差异将其识别为 30 天再入院,连续 30 天再入院(Chain Len)将是一个单一的再入院链(Count)。
示例数据
CREATE TABLE dbo.Events (
EventID INT IDENTITY(1,1) PRIMARY KEY,
EventDate DATE NOT NULL,
PersonID INT NOT NULL
);
GO
INSERT dbo.Events (EventDate, PersonID)
VALUES
('2014-01-01', 1), ('2014-01-05', 1), ('2014-02-02', 1), ('2014-03-30', 1), ('2014-04-04', 1),
('2014-01-11', 2), ('2014-02-02', 2),
('2014-01-03', 3), ('2014-03-03', 3);
GO
示例输出
EventID EventDate PersonID CHAIN LEN Count
------- ---------- -------- --------- -----
1 2014-01-01 1 1 1
2 2014-01-05 1 2 1
3 2014-02-02 1 3 1
------- ---------- -------- --------- -----
4 2014-03-30 1 1 2
5 2014-04-04 1 2 2
------- ---------- -------- --------- -----
6 2014-01-11 2 1 1
7 2014-02-02 2 2 1
------- ---------- -------- --------- -----
8 2014-01-03 3 1 1
------- ---------- -------- --------- -----
9 2014-03-03 3 1 2
------- ---------- -------- --------- -----
这是一个 Oracle 解决方案;看看它是否有效。您可能需要对 vertica 进行一些更改,因为每个 db 方言都有其自身的怪癖。 Vertica确实支持解析函数,这是主要成分。
这里使用的方法是一个非常有名的方法,它通常被称为"start-of-groups"方法(对于在最内层子查询中创建的"flags")。
select eventid, eventdate, personid,
row_number() over
(partition by personid, ct order by eventdate) as chain_len,
ct
from (
select eventid, eventdate, personid,
count(flag) over
(partition by personid order by eventdate) + 1 as ct
from (
select eventid, eventdate, personid,
case when eventdate > lag(eventdate) over
(partition by personid order by eventdate) + 30
then 0 end as flag
from events
)
)
order by personid, eventdate -- if needed
;
我正在尝试做与 this question 完全相同的事情。但我在 Vertica,我找不到执行最佳答案或其他答案的方法。所以基本上我已经尝试了 connect by 和子查询 UNION ALL 方法,我认为 Vertica 不支持它。
有什么方法可以在 Vertica 中复制该解决方案?
编辑:完整问题
我正在尝试计算 30 天再入院链,这是从上次入院后 30 天内的一系列再入院。以下数据显示了一个简化的情况,我们有事件,而不是入院和出院。事件之间的天数差异将其识别为 30 天再入院,连续 30 天再入院(Chain Len)将是一个单一的再入院链(Count)。
示例数据
CREATE TABLE dbo.Events (
EventID INT IDENTITY(1,1) PRIMARY KEY,
EventDate DATE NOT NULL,
PersonID INT NOT NULL
);
GO
INSERT dbo.Events (EventDate, PersonID)
VALUES
('2014-01-01', 1), ('2014-01-05', 1), ('2014-02-02', 1), ('2014-03-30', 1), ('2014-04-04', 1),
('2014-01-11', 2), ('2014-02-02', 2),
('2014-01-03', 3), ('2014-03-03', 3);
GO
示例输出
EventID EventDate PersonID CHAIN LEN Count
------- ---------- -------- --------- -----
1 2014-01-01 1 1 1
2 2014-01-05 1 2 1
3 2014-02-02 1 3 1
------- ---------- -------- --------- -----
4 2014-03-30 1 1 2
5 2014-04-04 1 2 2
------- ---------- -------- --------- -----
6 2014-01-11 2 1 1
7 2014-02-02 2 2 1
------- ---------- -------- --------- -----
8 2014-01-03 3 1 1
------- ---------- -------- --------- -----
9 2014-03-03 3 1 2
------- ---------- -------- --------- -----
这是一个 Oracle 解决方案;看看它是否有效。您可能需要对 vertica 进行一些更改,因为每个 db 方言都有其自身的怪癖。 Vertica确实支持解析函数,这是主要成分。
这里使用的方法是一个非常有名的方法,它通常被称为"start-of-groups"方法(对于在最内层子查询中创建的"flags")。
select eventid, eventdate, personid,
row_number() over
(partition by personid, ct order by eventdate) as chain_len,
ct
from (
select eventid, eventdate, personid,
count(flag) over
(partition by personid order by eventdate) + 1 as ct
from (
select eventid, eventdate, personid,
case when eventdate > lag(eventdate) over
(partition by personid order by eventdate) + 30
then 0 end as flag
from events
)
)
order by personid, eventdate -- if needed
;