SQL получить MAX () значение значений в списке - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть база данных транзакций между клиентами, которую можно описать следующим образом:

Transaction ID  Sender  Receiver    Sender  Receiver Receipt
1   A   B   2   4
2   C   A   5   1
3   B   C   5   1
4   C   B   3   4

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

, например, A: 1 (последнее вхождение A находится в строке 2 в качестве отправителя) B: 4 (последнее вхождениеB находится в строке 4 в качестве получателя) C: 3 (последнее вхождение C находится в строке 4 в качестве отправителя)

Спасибо,

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Получить последнюю транзакцию, в которой был задействован пользователь в качестве отправителя, и то же самое для получателей.Объедините оба результата и нарисуйте последнюю транзакцию, в которой пользователь участвовал в любой роли.Присоединитесь к транзакции и используйте CASE для вывода квитанции в зависимости от роли, которую пользователь имел в транзакции.

SELECT `Last Transaction`.`Sender or Receiver`,
       CASE `Last Transaction`.`Sender or Receiver`
         WHEN `elbat`.`Sender` THEN
           `elbat`.`Sender Receipt`
         WHEN `elbat`.`Receiver` THEN
           `elbat`.`Receiver Receipt`
       END `Last Receipt`
       FROM (SELECT max(`Transaction ID`) `Transaction ID`,
                    `Sender or Receiver`
                    FROM (SELECT max(`Transaction ID`) `Transaction ID`,
                                 `Sender` `Sender or Receiver`
                                 FROM `elbat`
                                 GROUP BY `Sender`
                          UNION ALL
                          SELECT max(`Transaction ID`) `Transaction ID`,
                                 `Receiver` `Sender or Receiver`
                                 FROM `elbat`
                                 GROUP BY `Receiver`) `Last Transaction`
                    GROUP BY `Sender or Receiver`) `Last Transaction`
            INNER JOIN `elbat`
                       ON `elbat`.`Transaction ID` = `Last Transaction`.`Transaction ID`;

db <> fiddle

0 голосов
/ 21 декабря 2018

Если у вас есть таблица клиентов, вы можете сделать:

select c.*,
       (select max(t.transactionid)
        from t
        where c.customerId in (t.sender, t.receiver)
       ) as last_transactionid
from customers c;

Это может иметь плохие характеристики производительности.Эта версия может быть лучше с правильными индексами:

select c.*,
       greatest( (select max(t.transactionid)
                  from t
                  where c.customerId = t.sender
                 ),
                 (select max(t.transactionid)
                  from t
                  where c.customerId = t.receiver
                 )
               ) as last_transactionid
from customers c;
0 голосов
/ 21 декабря 2018

Я угадываю имена столбцов, потому что они не понятны в вашем вопросе.Сначала создайте запрос, состоящий из 3 столбцов TransactionID, имя, квитанция.Это возвращает двойные строки из исходной таблицы: 1 строка для отправителя и квитанции и 1 строка для получателя и квитанции.Из этого результата получают только те строки, которые имеют максимальный идентификатор для каждого имени (snder или получатель):

WITH t AS(
  SELECT TransactionID, Sender AS name, SenderReceipt AS receipt FROM transactions
  UNION
  SELECT TransactionID, Receiver AS name, ReceiverReceipt AS receipt FROM transactions
) 
SELECT 
  name, 
  receipt 
FROM t
WHERE 
  t.TransactionID = (
    SELECT MAX(TransactionID) 
    FROM t AS tt
    WHERE tt.name = t.name);
...