【问题标题】:Filter bigquery table based on Id and dates from another table根据 Id 和来自另一个表的日期过滤 bigquery 表
【发布时间】:2019-10-16 21:47:18
【问题描述】:

我是大查询的新手,我正在尝试使用两个大查询表获取一些数据。第一个表包含 id 和购买日期,第二个日期包含所有用户活动,其中包含活动当天的日期列。

我要做的是针对第一个表中的所有 ID,从第二个表中获取所有这些 ID 的所有活动,以便活动日期介于购买表的日期和该日期后 30 周之间购买表。

WITH
  purchasers AS (
  SELECT
    *
  FROM
    `table1`),

  activity AS(
  SELECT
    *
  FROM
    `table2`
  WHERE
    date BETWEEN (DATE_SUB(purchasers.four_week_back,INTERVAL 30 week))
    AND ((purchasers.four_week_back)) )

SELECT
  *
FROM
  purchasers
JOIN
  activity
USING
  (id)
Table 1- 

Id      product_type_id     created_at      four_week_back
594157      72               2018-09-27     2018-03-01
10532522    72               2018-09-27     2018-03-01
535061      72               2018-09-27     2018-03-01
10740216    72               2018-09-27     2018-03-01
6093925     72               2018-09-27     2018-03-01
1712485     72               2018-09-28     2018-03-02
3381129     72               2018-09-28     2018-03-02
4290069     72               2018-09-28     2018-03-02
647413      72               2018-09-28     2018-03-02
10482204    72               2018-09-28     2018-03-02
6585925     72               2018-09-28     2018-03-02
1409073     72               2018-09-28     2018-03-02
10749573    72               2018-09-28     2018-03-02
Table 2- 
id  date        varA    var2 
594157      2018-02-19  5637    TRUE
594157      2018-02-04  43160   FALSE
594157      2018-01-17  43160   TRUE
10740216    2018-02-06  43160   FALSE
10740216    2018-02-19  43160   TRUE
10740216    2018-02-09  43161   FALSE
10740216    2017-12-27  43161   TRUE
4290069     2018-02-18  43161   FALSE
4290069     2018-01-05  43161   TRUE
4290069     2018-02-07  43161   FALSE
4290069     2018-02-18  43161   TRUE
4290069     2018-02-19  43161   FALSE
4290069     2018-01-27  43162   TRUE

但是我一直无法这样做。期望的输出是对于表 1 中的所有 id,从表中获取日期范围(table1.date 和 table1.date,30 周间隔)之间的活动。

【问题讨论】:

标签: mysql google-analytics google-bigquery


【解决方案1】:

期望的输出是对于表 1 中的所有 id,从表中获取日期范围(table1.date 和 table1.date,30 周间隔)之间的活动

以下是 BigQuery 标准 SQL

#standardSQL
SELECT *
FROM `project.dataset.table1` t1
LEFT JOIN `project.dataset.table2` t2
USING (id) 
WHERE date BETWEEN DATE_SUB(created_at, INTERVAL 30 WEEK) AND created_at  

注意:您可以在上面使用SELECT *,假设没有其他不明确的列而不是id

下面是你测试的例子

#standardSQL
WITH `project.dataset.table1` AS (
  SELECT 594157 id, 72 product_type_id, DATE '2018-09-27' created_at, DATE '2018-03-01' four_week_back UNION ALL
  SELECT 10532522, 72, '2018-09-27', '2018-03-01' UNION ALL
  SELECT 535061, 72, '2018-09-27', '2018-03-01' UNION ALL
  SELECT 10740216, 72, '2018-09-27', '2018-03-01' UNION ALL
  SELECT 6093925, 72, '2018-09-27', '2018-03-01' UNION ALL
  SELECT 1712485, 72, '2018-09-28', '2018-03-02' UNION ALL
  SELECT 3381129, 72, '2018-09-28', '2018-03-02' UNION ALL
  SELECT 4290069, 72, '2018-09-28', '2018-03-02' UNION ALL
  SELECT 647413, 72, '2018-09-28', '2018-03-02' UNION ALL
  SELECT 10482204, 72, '2018-09-28', '2018-03-02' UNION ALL
  SELECT 6585925, 72, '2018-09-28', '2018-03-02' UNION ALL
  SELECT 1409073, 72, '2018-09-28', '2018-03-02' UNION ALL
  SELECT 10749573, 72, '2018-09-28', '2018-03-02' 
), `project.dataset.table2` AS (
  SELECT 594157 id, DATE '2018-03-19' day, 5637 varA, TRUE var2 UNION ALL
  SELECT 594157, '2018-03-04', 43160, FALSE UNION ALL
  SELECT 594157, '2018-01-17', 43160, TRUE UNION ALL
  SELECT 10740216, '2018-03-06', 43160, FALSE UNION ALL
  SELECT 10740216, '2018-03-19', 43160, TRUE UNION ALL
  SELECT 10740216, '2018-02-09', 43161, FALSE UNION ALL
  SELECT 10740216, '2017-12-27', 43161, TRUE UNION ALL
  SELECT 4290069, '2018-02-18', 43161, FALSE UNION ALL
  SELECT 4290069, '2018-01-05', 43161, TRUE UNION ALL
  SELECT 4290069, '2018-02-07', 43161, FALSE UNION ALL
  SELECT 4290069, '2018-02-18', 43161, TRUE UNION ALL
  SELECT 4290069, '2018-02-19', 43161, FALSE UNION ALL
  SELECT 4290069, '2018-01-27', 43162, TRUE 
)
SELECT *
FROM `project.dataset.table1` t1
LEFT JOIN `project.dataset.table2` t2
USING (id) 
WHERE day BETWEEN DATE_SUB(created_at, INTERVAL 30 WEEK) AND created_at   

结果

Row id          product_type_id created_at  four_week_back  day         varA    var2     
1   594157      72              2018-09-27  2018-03-01      2018-03-19  5637    true     
2   594157      72              2018-09-27  2018-03-01      2018-03-04  43160   false    
3   10740216    72              2018-09-27  2018-03-01      2018-03-06  43160   false    
4   10740216    72              2018-09-27  2018-03-01      2018-03-19  43160   true     

【讨论】:

  • 您好,Mikhail,AND created_at 之后的查询末尾是否缺少某些内容
  • 不是真的!顺便说一句,我假设 created_at 字段的数据类型为 DATE - 你为什么问?
  • created_at 是 DATE 类型,抱歉我误解了它。愚蠢的问题!
  • 没问题。添加示例供您测试。注意:稍微修改了您的初始数据(在表 2 中),否则活动中没有符合条件的行
【解决方案2】:

请看下面的查询:

#standardSQL
WITH purchasers AS (
  SELECT 'aaa' id, DATE '2019-09-01' four_week_back UNION ALL
  SELECT 'bbb' id, DATE '2019-09-01' four_week_back UNION ALL
  SELECT 'ccc' id, DATE '2019-09-01' four_week_back
), activity AS (
  SELECT 'aaa' id, DATE '2019-09-01' date UNION ALL
  SELECT 'aaa' id, DATE '2019-08-15' date UNION ALL
  SELECT 'aaa' id, DATE '2019-08-01' date UNION ALL
  SELECT 'aaa' id, DATE '2018-07-01' date UNION ALL
  SELECT 'bbb' id, DATE '2019-10-01' date UNION ALL
  SELECT 'bbb' id, DATE '2019-08-15' date UNION ALL
  SELECT 'bbb' id, DATE '2019-08-01' date UNION ALL
  SELECT 'bbb' id, DATE '2018-07-01' date 
)
SELECT a.*
FROM purchasers p, activity a
WHERE p.id = a.id
  AND a.date BETWEEN (DATE_SUB(p.four_week_back,INTERVAL 30 week))
    AND ((p.four_week_back)) 

输出:

+-----+------------+
| id  |    date    |
+-----+------------+
| aaa | 2019-09-01 |
| aaa | 2019-08-15 |
| aaa | 2019-08-01 |
| bbb | 2019-08-15 |
| bbb | 2019-08-01 |
+-----+------------+

【讨论】:

  • 非常感谢您的回复。我应该为我现在完成的表格更新一个示例。我希望您共享的查询可以在这两个表上工作。我是否必须一次又一次地写ID。我正在处理 2700 万张桌子
  • 考虑到数据的大小,最好从一些抽样数据开始,而不是花钱调试查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多