2个最短日期之间的差异

时间:2018-05-14 04:14:00

标签: google-bigquery

我在Big查询中有一组数据,每个日期都有客户访问(单独的行)。我想找到第一个购买日期和第二个日期之间的天数差距。看起来像这样

会员卡号码saledate
AA687980 11/03/2017
AA890785 21/05/2016
AA687980 30/05/2017
BBY679088 04/04/2018
AA687980 29/05/2018

我需要以下结果
AA687980 80天(2017年5月30日 - 11月3日)

我使用了以下查询,但是出现了错误。我正在使用大查询

  

选择TB1.membercardnumber
           ,TB1.saledate
          ,TB1.nextdate
          ,date_diff(TB1.saledate,TB1.nextdate,day)
   FROM(选择(TB2.membercardnumber)           ,TB2.saledate
              (选择MIN(TB2.saledate)
              来自Table TB2)
              在哪里TB2.membercardnumber = TB1.membercardnumber AND TB2.saledate> TB1.saledate)AS Nextdate
        来自Table TB1)AS T

1 个答案:

答案 0 :(得分:1)

以下是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