Sql 用于用户保留的HPE Vertica live聚合投影示例 创建表事件( id字符(36)主键, game_id varchar(24)不为空, 用户\设备\ id字符(36)不为空, 事件名称varchar(100)不为空, 在时区不为空的时间戳处生成的\u ); 挑选 事件。生成时间::日期作为时间戳, 计数(不同( 当 events.event\u name='new\u user'然后是events.user\u device\u id 结束 ) )作为新用户, 计数(不同)( 当 future\u events.event\u名称“new\u user”,然后是future\u events.user\u device\u id 结束 ) )作为返回的用户, 计数(不同)( 当 future\u events.event\u名称“new\u user”,然后是future\u events.user\u device\u id 结束 ))/COUNT(不同)( 当 events.event\u name='new\u user'然后是events.user\u device\u id 结束 ))::浮动作为保留 从事件中 将事件作为未来的事件左键连接到 events.user\u device\u id=未来的\u events.user\u device\u id和 events.generated_at=未来_events.generated_at-间隔“1天”和 events.game\u id=未来的\u events.game\u id 分组 时间戳 订购人 时间戳;

Sql 用于用户保留的HPE Vertica live聚合投影示例 创建表事件( id字符(36)主键, game_id varchar(24)不为空, 用户\设备\ id字符(36)不为空, 事件名称varchar(100)不为空, 在时区不为空的时间戳处生成的\u ); 挑选 事件。生成时间::日期作为时间戳, 计数(不同( 当 events.event\u name='new\u user'然后是events.user\u device\u id 结束 ) )作为新用户, 计数(不同)( 当 future\u events.event\u名称“new\u user”,然后是future\u events.user\u device\u id 结束 ) )作为返回的用户, 计数(不同)( 当 future\u events.event\u名称“new\u user”,然后是future\u events.user\u device\u id 结束 ))/COUNT(不同)( 当 events.event\u name='new\u user'然后是events.user\u device\u id 结束 ))::浮动作为保留 从事件中 将事件作为未来的事件左键连接到 events.user\u device\u id=未来的\u events.user\u device\u id和 events.generated_at=未来_events.generated_at-间隔“1天”和 events.game\u id=未来的\u events.game\u id 分组 时间戳 订购人 时间戳;,sql,vertica,retention,Sql,Vertica,Retention,我试图通过上面的sql查询获取第N天('N'->1到7之间的任何数字)用户保留期。由于我是HPE vertica的noob,我无法提出最佳聚合投影创建语句,因为投影显著提高了查询的性能。聚合投影对连接查询没有帮助 可以创建按联接列分段和排序的常规投影,以提高性能: create table events( id char(36) PRIMARY KEY, game_id varchar(24) not null, user_device_id char(36) not

我试图通过上面的sql查询获取第N天('N'->1到7之间的任何数字)用户保留期。由于我是HPE vertica的noob,我无法提出最佳聚合投影创建语句,因为投影显著提高了查询的性能。

聚合投影对连接查询没有帮助

可以创建按联接列分段和排序的常规投影,以提高性能:

create table events(
    id char(36) PRIMARY KEY,
    game_id varchar(24) not null, 
    user_device_id char(36) not null, 
    event_name varchar(100) not null, 
    generated_at timestamp with time zone not null
);

SELECT 
    events.generated_at::DATE AS time_stamp, 
    COUNT(DISTINCT ( 
        CASE WHEN 
            events.event_name = 'new_user' THEN events.user_device_id 
        END
        )
    ) as new_users, 
    COUNT(DISTINCT (
        CASE WHEN 
            future_events.event_name <> 'new_user' THEN future_events.user_device_id 
        END
        )
    ) as returned_users, 
    COUNT(DISTINCT (
        CASE WHEN 
            future_events.event_name <> 'new_user' THEN future_events.user_device_id 
        END
    )) / COUNT(DISTINCT (
        CASE WHEN 
            events.event_name = 'new_user' THEN events.user_device_id 
        END
    ))::float as retention 
FROM events 
    LEFT JOIN events AS future_events ON 
        events.user_device_id = future_events.user_device_id AND 
        events.generated_at = future_events.generated_at - interval '1 day' AND 
        events.game_id = future_events.game_id
GROUP BY 
    time_stamp 
ORDER BY 
    time_stamp;

在选择、执行和共享之前添加解释result@Up_One为什么?@Prataksha-支付的总价格并没有被速度所取代。考虑ETL 2仪表板步骤。在使用AGG Proj时,您必须遵守许多限制,而且增加的复杂性使其不太可用
CREATE PROJECTION events_p1 (
id,
game_id ENCODING RLE,
user_device_id ENCODING RLE,
event_name,
generated_at ENCODING RLE
) AS
SELECT id,
       game_id,
       user_device_id,
       event_name,
       generated_at
FROM events
ORDER BY generated_at,
         game_id, 
         user_device_id 
SEGMENTED BY hash(generated_at,game_id,user_device_id) ALL NODES KSAFE 1;