Подзапрос SQL, использующий группу за элементом из основного запроса - PullRequest
1 голос
/ 25 марта 2019

У меня есть таблица с отметкой времени 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 ]

2 голосов
/ 25 марта 2019

Используйте совокупное агрегирование.Но я не думаю, что вам нужен 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 голос
/ 25 марта 2019

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;

Надеюсь, это поможет

...