带有条件的bigquery查询计数列

时间:2015-08-20 08:16:24

标签: sql google-bigquery

我有一个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(这是时间戳。这里给出的日期时间格式仅供读取。我使用epoch long timestamp来查询)。

  

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

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

2 个答案:

答案 0 :(得分:1)

BigQuery时间戳具有微秒级的分辨率,因此您可能无意中与非常小/早期的时间戳进行比较。

我建议您在过滤时使用SEC_TO_TIMESTAMPTIMESTAMP。例如,您可以写:

WHERE error_time_stamp >= SEC_TO_TIMESTAMP(1440076613)

或者:

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

答案 1 :(得分:0)

首先,您在此处提供的时间戳记: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