До сих пор неясно, что именно представляет из себя схема ваших данных: на основе макета - похоже, дата и время - это массив, но на основе типа данных, который вы показываете на изображении - это может быть просто обычное поле, поэтому ниже охватывают обакейсы (для BigQuery Standard SQL)
Кейс 1 - повторяющееся поле
#standardSQL
SELECT name
FROM `project.dataset.table`
WHERE 7 < (
SELECT DATETIME_DIFF(
datetime,
LAG(datetime) OVER(PARTITION BY name ORDER BY datetime),
DAY) distance
FROM UNNEST(datetime) datetime
ORDER BY IFNULL(distance, 777)
LIMIT 1
)
, которое вы можете протестировать, поиграйте с ним, используя фиктивные данные, как показано ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'Adam' name,
[DATETIME '2018-07-26T17:55:03',
'2018-07-27T17:55:03',
'2018-06-29T17:55:03',
'2018-07-16T17:55:03',
'2018-08-19T17:55:03',
'2018-07-14T17:55:03'] datetime UNION ALL
SELECT 'Paul', [DATETIME '2018-08-26T17:55:03',
'2018-08-18T17:55:03',
'2018-06-20T17:55:03',
'2018-08-09T17:55:03',
'2018-07-16T17:55:03']
)
SELECT name
FROM `project.dataset.table`
WHERE 7 < (
SELECT DATETIME_DIFF(
datetime,
LAG(datetime) OVER(PARTITION BY name ORDER BY datetime),
DAY) distance
FROM UNNEST(datetime) datetime
ORDER BY IFNULL(distance, 777)
LIMIT 1
)
Случай 2 - обычное (не повторяющееся поле)
#standardSQL
SELECT name FROM (
SELECT name,
DATETIME_DIFF(
datetime,
LAG(datetime) OVER(PARTITION BY name ORDER BY datetime),
DAY
) distance
FROM `project.dataset.table`
)
GROUP BY name
HAVING MIN(distance) > 7
Пример фиктивных данных ниже:
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'Adam' name, DATETIME '2018-07-26T17:55:03' datetime UNION ALL
SELECT 'Adam', '2018-07-27T17:55:03' UNION ALL
SELECT 'Adam', '2018-06-29T17:55:03' UNION ALL
SELECT 'Adam', '2018-07-16T17:55:03' UNION ALL
SELECT 'Adam', '2018-08-19T17:55:03' UNION ALL
SELECT 'Adam', '2018-07-14T17:55:03' UNION ALL
SELECT 'Paul', '2018-08-26T17:55:03' UNION ALL
SELECT 'Paul', '2018-08-18T17:55:03' UNION ALL
SELECT 'Paul', '2018-06-20T17:55:03' UNION ALL
SELECT 'Paul', '2018-08-09T17:55:03' UNION ALL
SELECT 'Paul', '2018-07-16T17:55:03'
)
SELECT name FROM (
SELECT name,
DATETIME_DIFF(
datetime,
LAG(datetime) OVER(PARTITION BY name ORDER BY datetime),
DAY
) distance
FROM `project.dataset.table`
)
GROUP BY name
HAVING MIN(distance) > 7
оба возвращают один и тот же результат
Row name
1 Paul