SQL子查询使用主查询中的按项目分组

时间:2019-03-25 14:43:59

标签: sql postgresql subquery sql-subselect

我有一个带有created时间戳和id标识符的表。

我可以通过以下方式获得每周唯一id的数量:

SELECT date_trunc('week', created)::date AS week, count(distinct id) 
FROM my_table
GROUP BY week ORDER BY week;

现在,我想按每周唯一的created来累积id的数量,就像这样:

SELECT date_trunc('week', created)::date AS week, count(distinct id),
       (SELECT count(distinct id)
        FROM my_table
        WHERE date_trunc('week', created)::date <= week) as acc
FROM my_table
GROUP BY week ORDER BY week;

但这不起作用,因为无法在子选择(week)中访问ERROR: column "week" does not exist

我该如何解决?

我正在使用PostgreSQL

2 个答案:

答案 0 :(得分:2)

使用累积聚合。但是,我认为您不需要distinct,所以:

SELECT date_trunc('week', created)::date AS week, count(*) as cnt,
       SUM(COUNT(*)) OVER (ORDER BY MIN(created)) as running_cnt
FROM my_table
GROUP BY week
ORDER BY week;

在任何情况下,如您所说的那样,您可以将cnt更改为使用count(distinct)。您的子查询根本没有使用distinct

答案 1 :(得分:1)

CTE或临时表应该可以解决您的问题。这是使用CTE的示例。

 WITH abc AS (
     SELECT date_trunc('week', created)::date AS week, count(distinct id) as IDCount
     FROM my_table
     GROUP BY week ORDER BY week;
 )

SELECT abc.week, abc.IDcount,
       (SELECT count(*)
        FROM my_table
        WHERE date_trunc('week', created)::date <= adc.week) as acc
FROM abc
GROUP BY week ORDER BY abc.week;

希望这会有所帮助