假设我有下表:
AccountID Email status_update date (dd/mm/yyyy)
123456 foo@gmail.com state1 02/02/2016
123456 foo@gmail.com state2 10/010/2018
456123 bar@gmail.com state2 05/04/2017
789123 foobar@gmail.com state2 22/04/2016
789123 foobar@gmail.com state1 17/06/2018
456345 cool@gmail.com state1 13/08/2017
456345 cool@gmail.com state2 09/07/2015
456345 cool@gmail.com state2 09/07/2014
这是我想要的输出:
UniqueID Email Most_recent_status_Update CountUniqueID
123456 foo@gmail.com state2 2
456123 bar@gmail.com state2 1
789123 foobar@gmail.com state1 2
456345 cool@gmail.com state1 3
所以基本上我希望能够group by Email
,unique(AccountID)
来选择基于status_update
的{{1}}
对我而言,困难的部分是能够选择基于MIN(date)
的{{1}}。我希望能够做到这样的事情:
status_update
我正在考虑使用MIN(date)
公式来实现这样的目标:
Select status_update when date = min(date)
我总是遇到各种错误。我无法构建整个查询。
谢谢
答案 0 :(得分:3)
请参阅下面的示例 - 适用于BigQuery Standard SQL
#standardSQL
WITH `project.dataset.table` AS (
SELECT 123456 accountID, 'foo@gmail.com' email, 'state1' status_update, '02/02/2016' dt UNION ALL
SELECT 123456, 'foo@gmail.com', 'state2', '10/10/2018' UNION ALL
SELECT 456123, 'bar@gmail.com', 'state2', '05/04/2017' UNION ALL
SELECT 789123, 'foobar@gmail.com', 'state2', '22/04/2016' UNION ALL
SELECT 789123, 'foobar@gmail.com', 'state1', '17/06/2018' UNION ALL
SELECT 456345, 'cool@gmail.com', 'state1', '13/08/2017' UNION ALL
SELECT 456345, 'cool@gmail.com', 'state2', '09/07/2015' UNION ALL
SELECT 456345, 'cool@gmail.com', 'state2', '09/07/2014'
)
SELECT
accountID,
email,
ARRAY_AGG(status_update ORDER BY PARSE_DATE('%d/%m/%Y', dt) DESC LIMIT 1)[OFFSET (0)] most_recent_status_update,
COUNT(1) AS cnt
FROM `project.dataset.table`
GROUP BY accountID, email
结果为
Row accountID email most_recent_status_update cnt
1 456123 bar@gmail.com state2 1
2 123456 foo@gmail.com state2 2
3 789123 foobar@gmail.com state1 2
4 456345 cool@gmail.com state1 3
对于您的真实用例,您应该使用类似下面的内容
#standardSQL
SELECT
accountID,
email,
ARRAY_AGG(status_update ORDER BY PARSE_DATE('%d/%m/%Y', dt) DESC LIMIT 1)[OFFSET (0)] most_recent_status_update,
COUNT(1) AS cnt
FROM `project.dataset.table`
GROUP BY accountID, email
注意:此示例假定特定的架构/数据类型(基于您的示例) - 因此,如果您的实际数据类型不同 - 您需要稍微调整一下:o)