如何在BigQuery中使用SQL函数合并重复值,满足DataStudio特定筛选下的聚合需求?
Hey there! Let's break down how to solve your problem. The key issue here is that total_session_by_day repeats across products on the same date—so if you just sum the raw data, you'll end up double-counting (200+200+500+500=1400 instead of the 700 you want). Here are a few practical ways to fix this in BigQuery:
1. 预处理数据:创建每日唯一Session数的视图
If you can pre-process your data, creating a view is the cleanest approach. This view will keep only one entry per date (since all products on the same date have the same session count, we can use ANY_VALUE, MAX, or MIN interchangeably):
CREATE OR REPLACE VIEW `your-project.your-dataset.daily_unique_sessions` AS SELECT Date, ANY_VALUE(total_session_by_day) AS total_session_by_day -- 如果你需要保留Product字段用于筛选,把`Product`加入SELECT和GROUP BY -- 注意:保留Product后,每个日期会有多条记录(每个产品一条),但session数相同 FROM `your-project.your-dataset.original-table` GROUP BY Date;
在Data Studio中使用这个视图时,直接对total_session_by_day求和即可——即使你选择多个产品,也会自动避免同一日期的重复计算。
2. 保留Product字段,同时防止重复计算
如果你需要在Data Studio中保留Product筛选维度,但又不想重复计算每日session数,可以用窗口函数标记每个日期的第一条记录,然后只对标记的记录求和:
首先运行这个查询(或基于它创建视图):
SELECT Date, Product, total_session_by_day, -- 标记每个日期的第一个产品记录为1,其余为0 ROW_NUMBER() OVER (PARTITION BY Date ORDER BY Product) AS row_num FROM `your-project.your-dataset.original-table`
然后在Data Studio中创建一个计算字段:
SUM(CASE WHEN row_num = 1 THEN total_session_by_day ELSE 0 END)
现在当你选择多个产品时,每个日期的session数只会被计入一次,最终结果就是你想要的700。
3. 直接计算最终总和(无需Data Studio筛选)
如果你不需要在Data Studio中按Product或Date筛选,只想直接得到700的结果,可以在BigQuery中直接计算:
SELECT SUM(daily_session) AS total_session FROM ( -- 先获取每个日期的唯一session数 SELECT Date, ANY_VALUE(total_session_by_day) AS daily_session FROM `your-project.your-dataset.original-table` GROUP BY Date )
这个查询先按日期去重,再对每日数值求和,直接得到700的结果。
重要提示
不要直接在原表上使用SUM(DISTINCT total_session_by_day)——这会错误地跨日期去重数值。比如如果7月3日的session数也是200,这种方式只会把200计算一次,而正确的结果应该是200+500+200=900。
内容的提问来源于stack exchange,提问作者Kit Lactuan

