You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GA4导出数据SQL报错:SessionsPerUser中EVENT_TIMESTAMP标识符无效

GA4数据聚合SQL编译错误排查:SessionsPerUser CTE中EVENT_TIMESTAMP无效标识符

错误信息

000904 (42000): SQL compilation error: error line 46 at position 11 invalid identifier 'EVENT_TIMESTAMP'

问题背景

编写从Google Analytics 4(GA4)导出数据提取聚合指标的SQL时,SessionsPerUser CTE出现上述编译错误。已确认event_timestamp字段在staging模型中存在,其他CTE均可正常使用该字段,怀疑问题出在GROUP BY语句或嵌套函数上。

完整SQL代码

WITH RECURSIVE DateDimension AS 
(
    SELECT '2024-01-01'::DATE AS date -- Start date
    UNION ALL
    SELECT DATEADD(day, 1, date)
    FROM DateDimension
    WHERE date < CURRENT_DATE() -- Automatically updates to include up to the current date
),
UserInfo AS 
(
    SELECT
        DATE(event_timestamp) AS event_date,
        user_pseudo_id,
        MAX(IFF(event_name IN ('first_visit', 'first_open'), 1, 0)) AS is_new_user,
        MAX(IFF(event_name = 'app_remove', 1, 0)) AS is_deletion,
        MAX(IFF(event_name = 'delete_account', 1, 0)) AS  is_account_deletion,
        MAX(IFF(param_exclusion = TRUE, 1, 0)) AS is_exclusion,
        SUM(param_ENGAGEMENT_TIME_MSEC) AS total_engagement_time,
        MAX(IFF(event_name = 'first_open', 1, 0)) AS is_download
    FROM 
        {{ ref('stg_google_analytics_events') }}
    GROUP BY 
        DATE(event_timestamp), user_pseudo_id
),
SessionInfo AS 
(
    SELECT
        DATE(event_timestamp) AS event_date,
        user_pseudo_id,
        param_ga_session_id,
        TIMESTAMPDIFF(SECOND, MIN(event_timestamp), MAX(event_timestamp)) AS session_duration
    FROM 
        {{ ref('stg_google_analytics_events') }}
    GROUP BY  
        DATE(event_timestamp), user_pseudo_id, param_ga_session_id
),
TotalSessions AS 
(
    SELECT
        DATE(event_timestamp) AS event_date,
        COUNT(DISTINCT param_ga_session_id) AS total_sessions
    FROM 
        {{ ref('stg_google_analytics_events') }}
    GROUP BY 
        DATE(event_timestamp)
),
SessionsPerUser AS 
(
    SELECT
        DATE(event_timestamp) AS event_date,
        AVG(session_count) AS sessions_per_user
    FROM 
        (SELECT
             DATE(event_timestamp) AS event_date,
             user_pseudo_id,
             COUNT(DISTINCT param_ga_session_id) AS session_count
         FROM 
             {{ ref('stg_google_analytics_events') }}
         GROUP BY 
             DATE(event_timestamp), user_pseudo_id) AS user_sessions
    GROUP BY 
        DATE(event_timestamp)
),
AggregatedMetrics AS 
(
    SELECT
        ui.event_date,
        COUNT(DISTINCT ui.user_pseudo_id) AS active_users,
        SUM(ui.is_new_user) AS signups,
        SUM(ui.is_deletion) AS deletions,
        SUM(ui.is_account_deletion) AS account_deletions,
        SUM(ui.is_exclusion) AS exclusions,
        SUM(ui.is_download) AS downloads,
        AVG(si.session_duration) AS average_session_duration,
        SUM(ui.total_engagement_time) / COUNT(DISTINCT si.param_ga_session_id) AS average_engagement_time,
        ts.total_sessions,
        spu.sessions_per_user
    FROM 
        UserInfo ui
    LEFT JOIN 
        SessionInfo si ON ui.user_pseudo_id = si.user_pseudo_id 
                       AND ui.event_date = si.event_date
    LEFT JOIN 
        TotalSessions ts ON ui.event_date = ts.event_date
    LEFT JOIN 
        SessionsPerUser spu ON ui.event_date = spu.event_date
    GROUP BY 
        ui.event_date, ts.total_sessions, spu.sessions_per_user
)
SELECT
    dd.date,
    COALESCE(am.downloads, 0) AS downloads,
    COALESCE(am.active_users, 0) AS active_users,
    COALESCE(am.signups, 0) AS signups,
    COALESCE(am.deletions, 0) AS deletions,
    COALESCE(am.account_deletions, 0) AS account_deletions,
    COALESCE(am.exclusions, 0) AS exclusions,
    COALESCE(am.total_sessions, 0) AS total_sessions,
    COALESCE(am.sessions_per_user, 0) AS sessions_per_user,
    COALESCE(am.average_session_duration, 0) AS average_session_duration,
    COALESCE(am.average_engagement_time, 0) AS average_engagement_time
FROM
    DateDimension dd
LEFT JOIN 
    AggregatedMetrics am ON dd.date = am.event_date
ORDER BY 
    dd.date

报错代码片段

SessionsPerUser AS 
(
    SELECT
      DATE(event_timestamp) AS event_date,
      AVG(session_count) AS sessions_per_user
    FROM (
        SELECT
          DATE(event_timestamp) AS event_date,
          user_pseudo_id,
          COUNT(DISTINCT param_ga_session_id) AS session_count
        FROM {{ ref('stg_google_analytics_events') }}
        GROUP BY DATE(event_timestamp), user_pseudo_id
    ) AS user_sessions
    GROUP BY DATE(event_timestamp)
),

解决思路与修复方案

问题根源

SessionsPerUser的外层查询中,直接调用DATE(event_timestamp)试图生成event_date,但外层查询只能访问内层子查询user_sessions返回的字段,无法直接访问原表的event_timestamp字段——子查询已经将DATE(event_timestamp)封装为event_date,原表字段在子查询外部不可见。

修复代码

将外层查询的DATE(event_timestamp)替换为子查询已生成的event_date字段,同时GROUP BY语句也改为使用event_date:

SessionsPerUser AS 
(
    SELECT
        event_date,
        AVG(session_count) AS sessions_per_user
    FROM 
        (SELECT
             DATE(event_timestamp) AS event_date,
             user_pseudo_id,
             COUNT(DISTINCT param_ga_session_id) AS session_count
         FROM 
             {{ ref('stg_google_analytics_events') }}
         GROUP BY 
             DATE(event_timestamp), user_pseudo_id) AS user_sessions
    GROUP BY 
        event_date
),

额外优化说明

内层子查询的GROUP BY可以保留原写法,也可以改为GROUP BY event_date, user_pseudo_id(部分SQL引擎支持直接使用子查询中的别名),两种写法均能正常运行,核心是确保外层查询仅使用子查询暴露的字段。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:35:00