Ниже для BigQuery Standard SQL
#standardSQL
SELECT
card,
DATE_DIFF(
PARSE_DATE('%d/%m/%Y', SPLIT(str, ' - ')[SAFE_OFFSET(1)]),
PARSE_DATE('%d/%m/%Y', SPLIT(str, ' - ')[SAFE_OFFSET(0)]),
DAY) days,
str
FROM (
SELECT
card, STRING_AGG(saledate, ' - ' ORDER BY PARSE_DATE('%d/%m/%Y', saledate) LIMIT 2) str
FROM `project.dataset.your_table`
GROUP BY card
)
WHERE NOT SPLIT(str, ' - ')[SAFE_OFFSET(1)] IS NULL
Вы можете протестировать / поиграть с ним, используя свои фиктивные данные, как показано ниже
#standardSQL
WITH `project.dataset.your_table` AS (
SELECT 'AA687980' card, '11/03/2017' saledate UNION ALL
SELECT 'AA890785', '21/05/2016' UNION ALL
SELECT 'AA687980', '30/05/2017' UNION ALL
SELECT 'BBY679088', '04/04/2018' UNION ALL
SELECT 'AA687980', '29/05/2018'
)
SELECT
card,
DATE_DIFF(
PARSE_DATE('%d/%m/%Y', SPLIT(str, ' - ')[SAFE_OFFSET(1)]),
PARSE_DATE('%d/%m/%Y', SPLIT(str, ' - ')[SAFE_OFFSET(0)]),
DAY) days,
str
FROM (
SELECT
card, STRING_AGG(saledate, ' - ' ORDER BY PARSE_DATE('%d/%m/%Y', saledate) LIMIT 2) str
FROM `project.dataset.your_table`
GROUP BY card
)
WHERE NOT SPLIT(str, ' - ')[SAFE_OFFSET(1)] IS NULL
результат будет
Row card days str
1 AA687980 80 11/03/2017 - 30/05/2017