我有一个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 |
答案 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子句中的日期,但这对我有用。