2016-09-14 63 views
0

我目前正在尝试计算谷歌大查询行之间的时间戳差异附加是我用来测试代码sample table的示例表。谷歌大查询行之间的时间差异

我使用此代码

SELECT 
    A.row, 
    A.issue.updated_at, 
(B.issue.updated_at - A.issue.updated_at) AS timedifference 
FROM [icxmedia-servers:icx_metrics.gh_zh_data_production] A 
INNER JOIN [icxmedia-servers:icx_metrics.gh_zh_data_production] B 
    ON B.row = (A.row + 1) 
WHERE issue.number==6 and issue.name=="archer" 
ORDER BY A.requestid ASC 

从这个问题Calculate the time difference between of two rows

回答

2

JOIN而是引用,这是更自然的使用解析函数来表示。 analytic functions with standard SQL in BigQuery的文档解释了分析函数的工作原理和语法。举个例子,如果你想采取如命令是由y列决定在x值连续的差异,你可以这样做:

WITH T AS (
    SELECT 
    x, 
    y 
    FROM UNNEST([9, 3, 4, 7]) AS x WITH OFFSET y) 
SELECT 
    x, 
    x - LAG(x) OVER (ORDER BY y) AS x_diff 
FROM T; 

注意,要BigQuery中运行这个,你需要取消选中“使用旧式SQL“框下的”显示选项“来启用标准SQL。 WITH T条款仅仅为示例设置了一些数据。

针对您的特殊情况下,你可能会想要一个查询,如:

SELECT 
    row, 
    issue.updated_at, 
    issue.updated_at - LAG(issue.updated_at) OVER (ORDER BY issue.updated_at) AS timedifference 
FROM `icxmedia-servers.icx_metrics.gh_zh_data_production` 
WHERE issue.number = 6 
    AND issue.name = "archer" 
ORDER BY requestid ASC; 

如果你想确定updated_at外面只是一个单一发行数量的差异,你可以使用一个PARTITION BY条款也是如此。例如:

SELECT 
    row, 
    issue.name, 
    issue.number, 
    issue.updated_at, 
    issue.updated_at - LAG(issue.updated_at) OVER (
     PARTITION BY issue.number 
     ORDER BY issue.updated_at) AS timedifference 
FROM `icxmedia-servers.icx_metrics.gh_zh_data_production` 
ORDER BY requestid ASC; 
+0

我尽力去做等于你的sugestion - AS为TimeDifference LAG(issue.updated_at)OVER(ORDER BY issue.updated_at) - - issue.updated_at在我的查询,但是我收到一个错误 - 缺少函数在分析表达中的应用。你有没有正确的可能性? –

+0

请用你想要实现的例子创建一个单独的问题。 –

+0

我试图获得行之间的差异,但值是整数,而不是时间戳。 LAG功能独自运作良好。但是如果我尝试做减法,你建议我收到警告 - 分析表达式中的缺失函数。是不同的列和值的同一个问题。 –