使用关联查询更改WHERE子句

时间:2015-07-07 15:45:30

标签: sql postgresql

我想运行此查询,就好像我过去每天运行它一样,看看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

其中的回应是;我不能返回多个列。

请帮忙。

欢迎嘲笑。

2 个答案:

答案 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 ;

但是,您可以使用分析函数。目前还不清楚你想要什么,因为这个问题没有样本数据和预期结果。