Получить сумму за последние записи в день за статью - PullRequest
0 голосов
/ 22 марта 2019

Допустим, есть таблица, структурированная так:

ID | article_id | article_count | created_at
---|------------------------------------------
1  |     1      |      10       | 2019-03-20T18:20:03.685059Z
2  |     1      |      22       | 2019-03-20T19:20:03.685059Z
3  |     2      |      32       | 2019-03-20T18:20:03.685059Z
4  |     2      |      20       | 2019-03-20T19:20:03.685059Z
5  |     1      |      3        | 2019-03-21T18:20:03.685059Z
6  |     1      |      15       | 2019-03-21T19:20:03.685059Z
7  |     2      |      3        | 2019-03-21T18:20:03.685059Z
8  |     2      |      30       | 2019-03-21T19:20:03.685059Z

Теперь цель состоит в том, чтобы суммировать по всем article_count всех article_ids для последних записей в деньи вернуть этот общий счет за день.Так что в приведенном выше случае я хотел бы получить результат, показывающий:

total   | date
--------|------------
  42    | 2019-03-20
  45    | 2019-03-21

До сих пор я пробовал что-то вроде:

SELECT SUM(article_count), DATE_TRUNC('day', created_at)
FROM myTable
WHERE created_at IN
(
SELECT DISTINCT ON (a.created_at::date, article_id::int) created_at
FROM myTable a 
ORDER BY created_at::date DESC, article_id, created_at DESC
)
GROUP BY DATE_TRUNC('day', created_at)

В отдельном запросе я пытался получить толькосамые последние записи в день для article_id и затем соответствуют created_at, чтобы суммировать все значения article_count.Это не работает - он по-прежнему выводит сумму за весь день вместо суммирования по последним записям.

Кроме того, я вполне уверен, что может быть более элегантный способ, чем условие where.

Заранее спасибо (а также за любые объяснения).

Ответы [ 2 ]

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

Я думаю, вы просто хотите отфильтровать до последней записи в день для каждой статьи:

SELECT DATE_TRUNC('day', created_at), SUM(article_count)
FROM (SELECT DISTINCT ON (a.created_at::date, article_id::int) a.*
      FROM myTable a 
      ORDER BY article_id, created_at::date DESC, created_at DESC
     ) a
GROUP BY DATE_TRUNC('day', created_at);
1 голос
/ 22 марта 2019

Вы ищете функцию ранга:

WITH cte 
     AS (SELECT article_id, 
                article_count, 
                Date_trunc('day', created_at)  AS some_date, 
                Row_number () 
                  OVER ( 
                    partition BY article_id, Date_trunc( 'day', created_at) 
                    ORDER BY created_at DESC ) AS n 
         FROM   mytable) 
SELECT Sum(article_count) AS total, 
       some_date 
FROM   cte 
WHERE  n = 1 
GROUP  BY some_date 

Просто добавьте первое число каждого дня / статьи.

Проверьте это на https://rextester.com/INODNS67085

...