我想运行此查询,就好像我过去每天运行它一样,看看CHANGE_ME,我需要每天重新运行。
SELECT Count(DISTINCT(ids)) AS pears,
c.geo_date
FROM fruit_factory a
INNER JOIN dim_user c
ON c.id = a.user_id
WHERE a.run_date > c.geo_date
AND a.run_date < CHANGE_ME
GROUP BY 2
所以我创建了一个包含日期的表,并使用了一个子查询:
SELECT dd.date,
(SELECT Count(DISTINCT(ids)) AS pears
FROM fruit_factory a
INNER JOIN dim_user c
ON c.id = a.user_id
WHERE a.run_date > c.geo_date
AND a.run_date < dd.date
GROUP BY 2)
FROM dim_date
但是我需要将上面的内容分解为另一个维度
SELECT dd.date,
(SELECT Count(DISTINCT(ids)) AS pears,
c.geo_date
FROM fruit_factory a
INNER JOIN dim_user c
ON c.id = a.user_id
WHERE a.run_date > c.geo_date
AND a.run_date < dd.date
GROUP BY 2)
FROM dim_date
其中的回应是;我不能返回多个列。
请帮忙。
欢迎嘲笑。
答案 0 :(得分:1)
如果我理解正确的话,我不是百分百肯定的。但我认为Gordon Linoff缺少GROUP BY子句的一部分。
SELECT
COUNT(DISTINCT(a.id)) AS pears,
d.date, # This is what previously was CHANGE_ME
c.geo_date
FROM fruit_factory a
JOIN dim_date d
ON a.run_date < d.date
LEFT JOIN dim_user u
ON u.id = a.user_id
WHERE a.run_date > u.geo_date
GROUP BY d.date, c.geo_date
以下是JOIN工作原理的一些解释。
拿这些表:
fruit_factory:
id run_date user_id
1 2015-08-30 3
2 2015-09-01 2
3 2015-09-02 1
dim_date:
date
2015-09-01
2015-09-02
先前:
SELECT ... WHERE date < CHANGE_ME.
8月1日:
1 2015-08-30 3
8月2日:
1 2015-08-30 3
2 2015-09-01 2
现在你使用了连接,这就是Join给你的东西:
id run_date user_id d.date
1 2015-08-30 3 2015-09-01
1 2015-08-30 3 2015-09-02
2 2015-09-01 2 2015-09-02
如您所见,第一行现在有两次,因为两个日期都符合连接条件。
如果您现在按照d.date分组以及之前分组的内容,就像在同一时间运行所有先前的查询一天:d.date组确保其他分组分别运行一个CHANGE_ME的值。
答案 1 :(得分:0)
请改用join
。 。
SELECT d.date, Count(DISTINCT(ids)) AS pears, c.geo_date
FROM fruit_factory a INNER JOIN
dim_user c
ON c.id = a.user_id AND
a.run_date > c.geo_date JOIN
dim_date d
WHERE a.run_date < d.date
GROUP BY c.geo_date ;
但是,您可以使用分析函数。目前还不清楚你想要什么,因为这个问题没有样本数据和预期结果。