Разница между 2 минимальными датами - PullRequest
0 голосов
/ 14 мая 2018

У меня есть набор данных в большом запросе, который посещает клиента по каждой дате (отдельные строки).Я хочу найти промежуток дней между 1-й датой покупки и 2-й датой.Выглядит это так:

Номер карты участника saledate
AA687980 11.03.2017
AA890785 21.05.05
AA687980 30.05.2017
BBY679088 04/04/2018
AA687980 29/05/2018

Мне нужен следующий результат
AA687980 80 дней (30/05/2017 -11/03/2017)

Я использовал следующий запрос, но есть ошибка.Я использую большой запрос

ВЫБРАТЬ TB1.membercardnumber
, TB1.saledate
, TB1.nextdate
, date_diff (TB1.saledate, TB1.nextdate, day)
ОТ (ВЫБРАТЬ (TB2.membercardnumber
, TB2.saledate
(ВЫБРАТЬ МИН (TB2.saledate)
ОТ Table TB2)
ГДЕ TB2.membercardnumber = TB1.membercardnumber AND TB2.saledate> TB1.saledate) AS Nextdate
ОТ Table TB1) AS T

1 Ответ

0 голосов
/ 15 мая 2018

Ниже для 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...