CREATE TABLE `account` (
`id` bigint(15) NOT NULL AUTO_INCREMENT,
`account_id` bigint(14) NOT NULL,
`acc_complete_id` bigint(14) DEFAULT NULL,
`uuid` varchar(400) NOT NULL,
`last_updated` datetime DEFAULT NULL,
`created` datetime DEFAULT NULL,
`balance` decimal(19,2) DEFAULT '0.00'
)
Транзакция
CREATE TABLE `transaction` (
`id` bigint(19) NOT NULL AUTO_INCREMENT,
`created` datetime DEFAULT NULL,
`amount` decimal(19,2) DEFAULT '0.00',
`debit` bigint(14) DEFAULT NULL,
`credit` bigint(14) DEFAULT NULL,
`credit_bal` decimal(19,2) DEFAULT '0.00',
`debit_bal` decimal(19,2) DEFAULT '0.00'
)
Поле идентификатора в таблице счетов, заполненное 1, и набор нулей - это столбец дебетования таблицы транзакций. Аналогично для кредита.
В таблице транзакций ведутся дебетовые и кредитовые записи пользователей, вовлеченных в txn.
- Последний баланс пользователя хранится в account.balance.
- Балансы пользователей в конце каждого txn есть в debit_bal и credit_bal.
Теперь нам нужно найти более старые балансы большинства пользователей в системе.
Для этого мы пытаемся получить последние дебетовые сальдо и последние кредитные сальдо для каждого пользователя -
Однако, это не порядок созданных дат для каждого uuid, а в конечном результате. установить, следовательно, не имеет смысла -
SELECT pa.uuid
, pt.debit_bal
, pt.created
FROM consumer.account pa force index (account_id_UNIQUE)
JOIN consumer.transaction pt
ON pa.account_id+ 100000000000 = pt.debit
GROUP
BY pa.uuid
ORDER
BY pt.created desc;
Некоторые примеры данных -
Таблица счетов -
+------+------------+-----------------+---------------------+---------------------+---------------------+---------+
| id | account_id | acc_complete_id | uuid | last_updated | created | balance |
+------+------------+-----------------+---------------------+---------------------+---------------------+---------+
| 29 | 50536 | 100000050536 | 1026651502611722400 | 2020-01-09 12:43:49 | 2018-01-01 00:00:01 | 2092.10 |
| 1337 | 53071 | 100000053071 | 7266704751953077361 | 2019-12-26 11:45:54 | 2019-10-22 18:13:21 | 99.00 |
| 30 | 50673 | 100000050673 | 8799857402485889540 | 2020-01-05 13:21:16 | 2017-01-01 00:00:01 | 2166.10 |
+------+------------+-----------------+---------------------+---------------------+---------------------+---------+
Транзакция
+---------+---------------------+--------+--------------+--------------+-----------+------------+
| id | created | amount | debit | credit | debit_bal | credit_bal |
+---------+---------------------+--------+--------------+--------------+-----------+------------+
| 2001705 | 2019-12-07 14:14:18 | 1.00 | 100000050536 | 3 | 2092.00 | 2332445.91 |
| 2001869 | 2020-05-08 14:29:00 | 4.00 | 100000050673 | 200000052870 | 2088.10 | 4.00 |
| 2001874 | 2020-05-09 14:45:04 | 4.00 | 100000050673 | 200000052870 | 2084.10 | 8.00 |
| 2001875 | 2020-05-09 14:46:37 | 4.00 | 100000050673 | 200000052870 | 2080.10 | 12.00 |
| 2002018 | 2019-11-29 18:05:41 | 50.00 | 100000053071 | 300000050673 | 0.00 | 2170.10 |
| 2002019 | 2019-11-29 18:07:41 | 1.00 | 100000053071 | 300000050673 | 100.00 | 2170.10 |
| 2002020 | 2019-11-29 18:07:56 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002021 | 2019-11-29 18:15:22 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002022 | 2019-11-29 18:18:45 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002023 | 2019-11-29 18:20:41 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002024 | 2019-11-29 18:24:18 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002025 | 2019-11-29 18:26:19 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002026 | 2019-11-29 18:28:41 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002027 | 2019-11-29 18:29:37 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002028 | 2019-11-29 18:30:40 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002029 | 2019-11-29 18:35:55 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002030 | 2019-11-29 18:42:16 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002031 | 2019-12-02 13:12:01 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002032 | 2019-12-02 13:18:21 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002033 | 2019-12-02 13:27:53 | 1.00 | 100000053071 | 5 | 100.00 | 580037.00 |
| 2002034 | 2019-12-02 13:38:11 | 1.00 | 100000053071 | 5 | 99.00 | 580038.00 |
+---------+---------------------+--------+--------------+--------------+-----------+------------+
Примечание - Невозможно экспортировать в файл csv, потому что я застрял с ОШИБКОЙ 1290 (HY000): Сервер MySQL работает с опцией --secure-file-priv, поэтому он не может выполнить этот оператор
Результаты Я Получение -
SELECT pa.uuid
, pt.debit_bal
, pt.created
FROM consumer.account pa force index (account_id_UNIQUE)
JOIN consumer.transaction pt
ON pa.account_id+ 100000000000 = pt.debit
GROUP
BY pa.uuid
ORDER
BY pt.created DESC;
+---------------------+-----------+---------------------+
| uuid | debit_bal | created |
+---------------------+-----------+---------------------+
| 8799857402485889540 | 2088.10 | 2020-05-08 14:29:00 |
| 1026651502611722400 | 2092.00 | 2019-12-07 14:14:18 |
| 7266704751953077361 | 0.00 | 2019-11-29 18:05:41 |
+---------------------+-----------+---------------------+
Для пользователя 8799857402485889540, 2088.10 не последний баланс. На самом деле, 2080.10 есть. Этот запрос не упорядочен по датам создания для каждого uuid, а скорее из окончательного набора результатов всех пользователей, поэтому не имеет смысла.
Обновление
пробовал с это также -
SELECT pa.uuid,
pt.debit_bal,
Max(pt.created)
FROM consumer.account pa FORCE INDEX (account_id_unique)
JOIN consumer.transaction pt
ON ( pa.account_id + 100000000000 ) = pt.debit
GROUP BY pa.uuid;
Возвращает самую последнюю дату txn, но не возвращает связанный debit_bal.
+---------------------+-----------+---------------------+
| uuid | debit_bal | max(pt.created) |
+---------------------+-----------+---------------------+
| 1026651502611722400 | 2092.00 | 2019-12-07 14:14:18 |
| 7266704751953077361 | 0.00 | 2019-12-02 13:38:11 |
| 8799857402485889540 | 2088.10 | 2020-05-09 14:46:37 |
+---------------------+-----------+---------------------+