将多个标量bigquery查询组合到单个查询中以生成一个表

时间:2017-07-10 22:17:57

标签: google-bigquery

我有一个BiqQuery查询,它基本上将日期作为参数,并计算我们的应用程序在该日期附近的活跃用户数。

现在,如果我想在一年的活跃用户上制作图表,我必须运行查询12次(每月一次)并手动整理结果,这很容易出错且耗时。

有没有办法制作一个运行子查询12次的bigquery查询并将结果放在12个不同的行上?

例如,如果我的查询是

SELECT COUNT(*) FROM MyTable WHERE activityTime < date '2017-01-01'

如何获得像

这样的表格
| Date       |  Count  |
|------------|---------|
| 2017-01-01 |  50000  |
| 2017-02-01 |  40000  |
| 2017-03-01 |  30000  |
| 2017-04-01 |  20000  |
| 2017-05-01 |  10000  |

2 个答案:

答案 0 :(得分:1)

假设您有一个名为date的列和一个名为user_id的列,并且您希望按月计算不同的用户,则可以运行查询,例如:

#standardSQL
SELECT
  DATE_TRUNC(date, MONTH) AS month,
  COUNT(DISTINCT user_id) AS distinct_users
FROM YourTable
GROUP BY month
ORDER BY month ASC;

(在这里,您可以将YourTable替换为您要运行的子查询。作为一个独立的例子:

#standardSQL
WITH YourTable AS (
  SELECT DATE '2017-06-25' AS date, 10 AS user_id UNION ALL
  SELECT DATE '2017-05-04', 11 UNION ALL
  SELECT DATE '2017-06-20', 10 UNION ALL
  SELECT DATE '2017-04-01', 11 UNION ALL
  SELECT DATE '2017-06-02', 12 UNION ALL
  SELECT DATE '2017-04-13', 10
)
SELECT
  DATE_TRUNC(date, MONTH) AS month,
  COUNT(DISTINCT user_id) AS distinct_users
FROM YourTable
GROUP BY month
ORDER BY month ASC;

答案 1 :(得分:1)

Elliot教我UNION ALL,似乎有把戏:

SELECT COUNT(*) FROM MyTable WHERE activityTime < date '2017-01-01'
UNION ALL
SELECT COUNT(*) FROM MyTable WHERE activityTime < date '2017-02-01'
UNION ALL
SELECT COUNT(*) FROM MyTable WHERE activityTime < date '2017-03-01'

也许有一种更好的方法来参数化WHERE子句中的日期,但这对我有用。