Mysql: выберите количество транзакций за 1 неделю назад

avatar
sanjayr
8 августа 2021 в 21:13
34
2
0

У меня есть такая таблица:

transactions
+------------+------------+ 
| date_id    | t_count    | 
+------------+------------+ 
| 2019-01-30 |       100  | 
| 2019-01-29 |        99  | 
| 2019-01-28 |        98  | 
| 2019-01-27 |        97  | 
| 2019-01-26 |        96  | 
| 2019-01-25 |        95  | 
| 2019-01-24 |        94  | 
| 2019-01-23 |        93  | 
| 2019-01-22 |        92  | 
| 2019-01-21 |        91  | 
| 2019-01-20 |        90  | 
+------------+------------+ 

Я хочу получить t_count для даты, а также t_count для предыдущей недели, например:

+------------+------------+------------------+ 
| date_id     | t_count   | t_count_7d_prev  | 
+------------+------------+------------------+ 
| 2019-01-30 |       100  |              93  | 
| 2019-01-29 |        99  |              92  | 
| 2019-01-28 |        98  |              91  | 
| 2019-01-27 |        97  |              90  | 
+------------+------------+------------------+

Я попытался выполнить следующий запрос, но он дает пустые значения для последнего столбца.

select
  date_id,
  t_count,
  (select t_count 
   from transactions 
   where date(date_id) = date(date_id) - interval 7 day) as t_count_7d_prev
from 
  transactions

Есть ли другой способ вычитания дат?

Источник

Ответы (2)

avatar
Gordon Linoff
8 августа 2021 в 21:16
1

Вы можете использовать оконные функции. Если date_id является датой:

select date_id, t_count,
       sum(t_count) over (order by date_id
                          range between interval 7 day preceding and interval 7 day preceding
                         ) as t_count_7d_prev
from transactions t;

Или, если вы уверены, что у вас есть данные на каждую дату, используйте lag():

select t.*,
       lag(t_count, 7) over (order by date_id) as t_count_7d_prev
from t;
avatar
AIMIN PAN
9 августа 2021 в 02:02
1

Это простое внутреннее соединение.

select a.date_id, a.t_count, b.t_count as t_count_7d_prev
from
    transactions a left join transaction b
    on a.dat_id = DATE_ADD(b.date_id,INTERVAL 7 DAY)