2016-09-14 4 views
0

В настоящее время я пытаюсь рассчитать разницу между метками времени между строками в прилагаемом Google большом запросе - это таблица примеров, которую я использую для проверки кода sample table.Разница во времени между строкой в ​​google big query

Я использую этот код

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 объясняется, как работают аналитические функции и что такое синтаксис. В качестве примера, если вы хотите принять последовательные различия в x значений, где порядок определяется по столбцам y, вы можете сделать:

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

Я пытался сделать что-то, равный вашему - issue.updated_at предложение приемлемо - LAG (issue.updated_at) OVER (ORDER BY issue.updated_at) AS timedifference - в моем запросе, но я получил ошибку - Отсутствует функции в аналитическом выражении. У вас есть право на это возможность? –

+0

Пожалуйста, создайте отдельный вопрос с примером того, чего вы пытаетесь достичь. –

+0

Я пытаюсь получить разницу между строками, но значения являются целыми числами, а не меткой времени. Функция LAG работает отлично. Но если я попытаюсь сделать вычитание, которое вы предложили, я получаю предупреждение - Отсутствует функция в аналитическом выражении. Это тот же вопрос с разными столбцами и значениями. –

 Смежные вопросы

  • Нет связанных вопросов^_^