我在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
答案 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