Как объединить два разных подсчета из двух разных диапазонов дат sql - PullRequest
0 голосов
/ 05 января 2019

Я постараюсь сохранить это простым.

У меня есть два запроса, которые прекрасно работают, они оба подсчитывают, сколько пользователей зарегистрировалось в тот день между определенным диапазоном дат.

Запрос 1 - получает список пользователей, которые подписались на каждый день в году с сегодняшнего дня. Вот картинка результата.

SELECT users.created::date,
       count(users.id)
FROM users
WHERE users.created::date < now() - interval '12 month'
  AND users.created::date > now() - interval '13 month'
  AND users.thirdpartyid = 100
GROUP BY users.created::date
ORDER BY users.created::date

Запрос 2 - получает список пользователей, которые подписались на каждый день месяц назад с сегодняшнего дня. Вот картинка этого исхода.

SELECT users.created::date,
       count(users.id)
FROM users
WHERE users.created::date > now() - interval '1 month'
  AND users.thirdpartyid = 100
GROUP BY users.created::date
ORDER BY users.created::date

Я застрял в том, как я могу объединить эти два запроса, чтобы я мог создать гистограмму стека на моем веб-сайте redash. Очевидно, это разные годы, но я бы хотел, чтобы моя ось X была днем ​​месяца, а Y - числом пользователей. Спасибо.

Edit:

Вот пример выходных данных, которые, я думаю, будут работать идеально для меня.

| Day of the month  | Users signed up December 2017 | Users signed up December 2018
|------------------ | ----------------------------- | -----------------------------|
|         01                       45                                56
| ----------------- | ----------------------------  | -----------------------------|
|         02                       47                                32
| ----------------- | ----------------------------  | -----------------------------|

etc...

1 Ответ

0 голосов
/ 05 января 2019

Вы можете попробовать использовать фильтры. Я позволил себе выбрать день месяца так, как вам этого хотелось, а не полную дату.

SELECT date_part('day', users.created::date) as day_of_month,
       count(users.id) FILTER (
           WHERE users.created::date < now() - interval '12 month'
           AND users.created::date > now() - interval '13 month') AS month_12,
       count(users.id) FILTER (
           WHERE users.created::date > now() - interval '1 month') AS month_1
FROM users
WHERE (
       (
            users.created::date < now() - interval '12 month'
        AND users.created::date > now() - interval '13 month'
       ) OR users.created::date > now() - interval '1 month'
      )
  AND users.thirdpartyid = 100
GROUP BY day_of_month
ORDER BY day_of_month
...