Промежуточная сумма за дату в MySQL - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть эта таблица, где id_user = 7

Таблица

7    2018-11-12
7    2018-11-12
7    2018-11-13
7    2018-11-13
7    2018-11-13
7    2018-11-13
7    2018-11-14
7    2018-11-15
7    2018-11-15
7    2018-11-15
7    2018-11-15
7    2018-11-15
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16
7    2018-11-16

Я хочу вернуть время, когда пользователь появился по дням, и совокупную сумму за предыдущие дни

Я уже пробовал ...

SELECT COUNT(*)
FROM posts
WHERE id_user='7'
GROUP BY DATE(date) 

ОЖИДАЕМЫЙ ВЫХОД

 day 12/11/2018 > 2 (2)
 day 13/11/2018 > 4 (6)
 day 14/11/2018 > 1 (7)
 day 15/11/2018 > 5 (12)
 day 16/11/2018 > 7 (19)

Как получить число в скобках?

1 Ответ

0 голосов
/ 17 ноября 2018

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

SELECT main.id_user, main.date, main.c AS today_count, main.c + COUNT(prev.date) AS running_count
FROM (
    SELECT id_user, date, COUNT(*) AS c
    FROM posts
    GROUP BY id_user, date
) AS main
LEFT JOIN posts AS prev ON prev.id_user = main.id_user AND prev.date < main.date
GROUP BY main.id_user, main.date, main.c
ORDER BY main.date DESC

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

Демонстрация на DB Fiddle

...