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

如何在BigQuery中按日统计总记录及time+id冲突记录数

BigQuery 查询实现每日记录数及冲突记录统计

原始数据

timeidvalue
2018-04-25 22:00:00 UTCA1
2018-04-25 23:00:00 UTCA2
2018-04-25 23:00:00 UTCA2.1
2018-04-25 23:00:00 UTCB1
2018-04-26 23:00:00 UTCB1.3

需求

生成包含以下列的结果表:

  • date:截断后的UTC日期
  • records:当日总记录数
  • records_conflicting_time_id:当日time与id组合不唯一的记录数(同一time+id下的所有重复记录都计入)

解决方案

通过窗口函数标记重复组合,再按日期聚合统计:

WITH tagged_data AS (
  SELECT
    DATE(time) AS date,
    -- 计算每条记录所属time+id组合的总条数
    COUNT(*) OVER (PARTITION BY time, id) AS group_count,
    1 AS record_count
  FROM
    `your_project.your_dataset.your_table` -- 替换为你的表路径
)
SELECT
  date,
  SUM(record_count) AS records,
  -- 统计group_count>1的记录总数
  SUM(CASE WHEN group_count > 1 THEN record_count ELSE 0 END) AS records_conflicting_time_id
FROM
  tagged_data
GROUP BY
  date
ORDER BY
  date;

逻辑说明

  1. CTE标记阶段:

    • 用DATE(time)将UTC时间截断为日期;
    • 窗口函数COUNT(*) OVER (PARTITION BY time, id)统计每个time+id组合的总记录数,标记为group_count;
    • 用1 AS record_count简化后续总记录数的求和计算。
  2. 聚合统计阶段:

    • 按date分组,SUM(record_count)得到当日总记录数;
    • 通过CASE WHEN筛选出group_count>1的记录,求和得到当日冲突记录总数。

执行查询后将得到预期输出:

daterecordsrecords_conflicting_time_id
2018-04-2542
2018-04-2610

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:48:16