Bigquery SQL代码可以提供最早的联系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bigquery SQL代码可以提供最早的联系相关的知识,希望对你有一定的参考价值。

我在bigquery中有一份salesforce数据的副本,我正在尝试将联系表与帐户表一起加入。

我想返回数据集中的每个帐户,但我只想要为每个帐户首先创建的联系人。

今天我四处乱逛,并试图拼凑查询,但所有道路要么导致没有帐户,单个帐户或每个帐户的大量联系人(忽略最早的要求)。

这是最新的查询。没有结果。我想我差不多了,但还在苦苦挣扎。非常感激任何的帮助。


SELECT distinct  
 c.accountid as Acct_id 
,a.id as a_Acct_ID
,c.id as Cont_ID
,a.id AS a_CONT_ID 
,c.email
,c.createddate

FROM `sfdcaccounttable` a

INNER JOIN `sfdccontacttable` c
ON c.accountid = a.id

INNER JOIN
    (SELECT a2.id, c2.accountid, c2.createddate AS MINCREATEDDATE
    FROM `sfdccontacttable` c2

    INNER JOIN `sfdcaccounttable` a2 ON a2.id = c2.accountid

 GROUP BY 1,2,3
 ORDER BY c2.createddate asc LIMIT 1) c3 
ON c.id = c3.id

ORDER BY a.id asc

LIMIT 10
答案

上面分享的解决方案非常特定于BigQuery:它确实有一些你需要解决的怪癖,就像你得到的内存错误一样。

我曾经回答过一个类似的问题here,它更便于携带,更易于维护。

基本上你需要创建一个较小的表(甚至更好地使它成为一个视图)与ID和它的第一个事务。它与您分享的内容类似,因为您只需要在最顶层的查询中进行分组。

它看起来像这样

select 
# contact ids that are first time contacts
b.id as cont_id,
b.accountid

from `sfdccontacttable` as b inner join 
(   select accountid,
    min(createddate) as first_tx_time
    FROM `sfdccontacttable`  
    group by 1) as a on (a.accountid = b.accountid and b.createddate = a.first_tx_time)
group by 1, 2

您需要这样做,否则您最终可能会为每个帐户设置多个ID(如果有任何其他维度与之关联)。这种方式也是未来的证明,因为您可以在不影响结果的情况下将多个维度添加到基础表中,并且您还可以在内部查询中使用where子句来定义“有效”联系人等等。然后,您可以将其保存为视图,并在任何子查询或连接操作中简单地引用它

另一答案

client_firstclient_last设置视图/子查询

如:

SELECT * except(_rank) from (
  select rank() over (partition by accountid order by createddate  ASC) as _rank, 
   * 
   FROM `prj.dataset.sfdccontacttable`  
)  where _rank=1

基本上它使用Window function对行进行编号,并使用ASC作为第一个客户端,使用最后一个客户端条目的DESC返回第一行。

你也可以为accounts做同样的事情,然后你就可以加入两个简单的,因为每个实体都有1条记录。

UPDATE

您也可以尝试使用占用内存较少的ARRAY_AGG。

#standardSQL
SELECT e.* FROM (
  SELECT ARRAY_AGG(
    t ORDER BY t.createddate ASC LIMIT 1
  )[OFFSET(0)]  e
  FROM `dataset.sfdccontacttable` t 
  GROUP BY t.accountid 
)

以上是关于Bigquery SQL代码可以提供最早的联系的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery/SQL - 特定变体的拆分值

Google Analytics 到 Bigquery 数据 - 自定义维度的 SQL 代码是啥?

BigQuery 标准 SQL 中的 JSON_EXTRACT?

Bigquery GA360 每日导出:查找最早的每日表

COMActiveXOLE的联系和区别

Datalab 到 BigQuery - 将变量值插入 SQL