当我运行代码时,不断发生日期错误。我已经解析了日期,但我怀疑我需要在代码的其他地方解析它。我尝试过这样做,但我显然错过了一些东西。
当 t1 单独运行时,我没有收到任何错误,因此我怀疑问题出在 t2 或 t3 中。
查询的数据是公开的GA4数据集,大家可以自己尝试一下。
提前非常感谢。
WITH t1 AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS event_date,
user_pseudo_id,
COUNT(DISTINCT user_pseudo_id) AS users,
MAX(CASE WHEN params.key = "ga_session_id" THEN params.value.int_value ELSE 0 END) AS sessionId,
CASE WHEN event_name = "first_visit" THEN 1 ELSE 0 END AS newUsers,
COUNT(ecommerce.transaction_id) AS conversions,
SUM(ecommerce.purchase_revenue) AS totalRevenue
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*` AS ga,
UNNEST (event_params) AS params
WHERE
_table_suffix BETWEEN '20210101' AND '20210131'
GROUP BY event_date, user_pseudo_id, event_name, ecommerce.transaction_id
),
t2 AS (
SELECT
user_pseudo_id,
COUNT(ecommerce.transaction_id) AS conv,
AVG(COUNT(ecommerce.transaction_id))
OVER (
PARTITION BY user_pseudo_id
ORDER BY user_pseudo_id
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS avg_conversion,
CAST(MAX(event_date) AS DATE) AS most_recent_purchase,
CAST(MIN(event_date) AS DATE) AS first_purchase
FROM
`bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*` AS ga,
UNNEST (event_params) AS params
WHERE
_table_suffix BETWEEN '20210101' AND '20210131'
GROUP BY user_pseudo_id, event_date
),
t3 AS (
SELECT
user_pseudo_id,
DATE_DIFF(
t2.most_recent_purchase, t2.first_purchase, DAY
) / 30.0 AS day_in_between_purchases,
t2.avg_conversion AS conversions
FROM t2
GROUP BY user_pseudo_id, most_recent_purchase, first_purchase, avg_conversion
)
SELECT
t1.event_date,
t4.newUsers,
t4.conversions,
t4.totalRevenue
FROM (
SELECT
t1.user_pseudo_id,
t1.event_date,
SUM(newUsers) AS newUsers,
SUM(conversions) AS conversions,
CONCAT('$', IFNULL(SUM(totalRevenue), 0)) AS totalRevenue
FROM
t1
GROUP BY t1.user_pseudo_id, t1.event_date
) AS t4
LEFT JOIN t3 ON t3.user_pseudo_id = t4.user_pseudo_id
LEFT JOIN t2 ON t2.user_pseudo_id = t4.user_pseudo_id
WHERE t2.conv > 0;
作为快速观察......当您解析
event_date
中的 t1
时,您不会在 t2
中执行此操作。
所以……如果
event_date
不是没有日期,我不会认为这是理所当然的,你的SQL方言(MS SQL Server?)可以只是cast
它。
除此之外......应该有一些有用的错误消息(有时它们甚至带有位置信息)。