Группировка и суммирование последних (по дате) значений в SQLite - PullRequest
0 голосов
/ 16 марта 2020

Например, есть таблица с данными:

-------------------------------------------------
|    date    |    account    | currency |  sum  |
-------------------------------------------------
| 2020-03-02 | EUR account 1 |   EUR    | 12000 |
| 2020-03-01 | EUR account 2 |   EUR    |  3000 |
| 2020-03-06 | USD account 1 |   USD    |  1234 |
| 2020-01-02 | GBP account 1 |   GBP    |  6800 |
| 2019-11-21 | EUR account 1 |   EUR    |  3584 |
| 2019-06-15 | EUR account 1 |   EUR    | 86874 |
| 2018-02-05 | USD account 1 |   USD    | 12121 |

SQL запрос к данным должен выбрать последние значения и сгруппировать их по валюте. Приведенная таблица должна иметь следующий вид:

--------------------
| currency |  sum  |
--------------------
|   EUR    | 15000 |
|   USD    |  1234 |
|   GBP    |  6800 |

Подскажите, пожалуйста, как правильно сделать этот запрос в SQLite?

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Используйте оконную функцию row_number(), чтобы выбрать последнюю запись для каждого account, а затем агрегировать:

select t.currency, sum(t.`sum`) `sum` 
from (
  select *, row_number() over (partition by account order by date desc) rn
  from tablename
) t 
where t.rn = 1
group by t.currency

См. Демоверсию . Результаты:

| currency | sum   |
| -------- | ----- |
| EUR      | 15000 |
| GBP      | 6800  |
| USD      | 1234  |
0 голосов
/ 16 марта 2020

Вы можете использовать:

select t.currency, sum(t.sum)
from t
where strftime('%Y', t.date) = (select strftime('%Y', max(t2.date))
                                from t t2
                                where t2.account = t.account and t2.currency = t.currency
                               )
group by t.currency;

Предложение where возвращает последнюю строку для каждой комбинации счет / валюта (неясно, нужна ли для этого валюта). Затем запрос агрегирует эти значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...