Получение старых остатков по кредитным и дебетовым счетам из таблицы транзакций для пользователей оптом - PullRequest
0 голосов
/ 08 января 2020
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 |
+---------------------+-----------+---------------------+

1 Ответ

0 голосов
/ 08 января 2020

Я должен сказать, что данные плохо организованы. Лучше изменить дизайн с учетом ваших требований. В любом случае переход к данным ...

отдельный (pa.uuid) в сочетании с другими столбцами в запросе выбора приведет к получению строки из того же UUID, а затем к сборке других столбцов на основе заданных условий, которые совсем не ожидается

Вместо этого просто возьмите pa.uuid и другие необходимые столбцы и можете добавить в качестве критерия максимум (зачислено).

Редактировать 1:

Вы группируете группу, которая бы выстраивала строки и достигала нежелательной строки. Попробуйте это.

select pa.uuid, pt.debit_bal, pt.created
from consumer.account pa join...on...
where pt.created= 
  (select max(pt1.created) from consumer.transaction pt1 
    where pt1.uuid= pa.uuid)
...