我有一个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.我的查询有什么问题?
答案 0 :(得分:1)
BigQuery时间戳具有微秒级的分辨率,因此您可能无意中与非常小/早期的时间戳进行比较。
我建议您在过滤时使用SEC_TO_TIMESTAMP
或TIMESTAMP
。例如,您可以写:
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