使用Bigquery根据另一列min(date)选择列的值

时间:2018-02-06 18:47:15

标签: google-bigquery

假设我有下表:

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 Emailunique(AccountID)来选择基于status_update的{​​{1}}

对我而言,困难的部分是能够选择基于MIN(date)的{​​{1}}。我希望能够做到这样的事情:

status_update

我正在考虑使用MIN(date)公式来实现这样的目标:

Select status_update when date = min(date)

我总是遇到各种错误。我无法构建整个查询。

谢谢

1 个答案:

答案 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)