【问题标题】:bigquery query count column with condition带有条件的 bigquery 查询计数列
【发布时间】:2015-11-13 18:52:29
【问题描述】:

我有一个 BigQuery 表,其结构如下:

file_id    |    file_name    |    error_time_stamp
_ _ _ _ _ _| _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ 

  1        |    abcd.txt     |     2015-08-19 19:29:22
  2        |    efgh.txt     |     2015-08-19 19:31:25
  1        |    abcd.txt     |     2015-08-19 19:32:20
  2        |    efgh.txt     |     2015-08-19 19:33:40
  2        |    efgh.txt     |     2015-08-19 19:34:36

我想查询该表以查找 file_id 的唯一计数并降序排序。我使用查询:

SELECT file_id, file_name, count(file_id) as counter FROM [dataset.tablename] group by file_id, file_name ORDER BY counter DESC LIMIT 1000

此查询运行良好,并提供如下所需的结果。

file_id    |    file_name    |    counter
_ _ _ _ _ _| _ _ _ _ _ _ _ _ | _ _ _ _ _ _

   2       |    efgh.txt     |     3
   1       |    abcd.txt     |     2

现在我想根据 error_time_stamp 大于 19:30:00 找到计数器(这是时间戳。这里给出的日期时间格式仅供阅读。我使用纪元长时间戳来查询)。

SELECT pp, ss, count(pp) AS counter FROM (SELECT file_id as pp, file_name as ss FROM [dataset.tablename] where error_time_stamp >= 1440076613) AS main_data group by pp, ss ORDER BY counter DESC LIMIT 1000

现在 file_id 1 的预期计数是 1。但我仍然得到 2。我的查询有什么问题?

【问题讨论】:

  • count(case when err_t_stamp >= ... then 1 end)
  • 请注意,您写的 Epoch 时间不是 19:30...无论您是哪个格林尼治标准时间.. 您的查询似乎很好.. 尝试像印度人建议的那样使用 count case when..
  • 您的 Epoch 时间戳计算为 19:17:57,而不是 19:30...使用正确的 Epoch。
  • @Balinti 时间戳只是一个示例,不完全是我正在运行的。我用 datetime.now() + timedelta(minutes=-30) 计算服务器中的时间戳以获得最后 30 分钟之前的时间,因为我只想要最后 30 分钟的报告
  • @Indian 我应该在哪个查询中添加这个? 1日还是2日?

标签: sql google-bigquery


【解决方案1】:

首先,您在此处提供的时间戳:1440076613 对应于 20 日,而不是 TIMESTAMP('2015-08-19 19:30:00')。

另一方面,Bigquery 可能以微秒或纳秒为单位解释纪元时间戳,这意味着所有日期都更高。

如果您想在同一个查询中获取所有信息。您可以执行以下操作:

SELECT 
    file_id, 
    file_name, 
    count(file_id) as counter
    SUM(IF(error_time_stamp >= TIMESTAMP('2015-08-19 19:30:00'), 1, 0)) as counter_over_19_30
FROM [dataset.tablename] 
GROUP BY file_id, file_name 
ORDER BY counter_over_19_30 DESC 
LIMIT 1000

【讨论】:

    【解决方案2】:

    BigQuery 时间戳的分辨率为微秒,因此您可能会无意中与一个非常小/较早的时间戳进行比较。

    我建议在过滤时使用SEC_TO_TIMESTAMP 或TIMESTAMP。例如,你可以这样写:

    WHERE error_time_stamp >= SEC_TO_TIMESTAMP(1440076613)
    

    或者:

    WHERE error_time_stamp >= TIMESTAMP('2015-08-19 19:30:00')
    

    【讨论】:

      猜你喜欢
      • 2022-07-07
      • 2014-04-09
      • 1970-01-01
      • 2022-11-09
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      相关资源
      最近更新 更多