2015-05-07 3 views
1

У меня есть таблица транзакций в SQLiteSQLite Эффективных Запуска Всего

Дата номера Категория Сумма runningBalance

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

Я могу сделать это при выборе при чтении. Но эта таблица может стать очень большой, и я не хочу пересчитывать каждый раз. Я хочу сделать триггер, где все транзакции, следующие за (по дате, затем номеру), вставили/отредактировали транзакцию, обновили значение runBalance.

Это будет означать, что расчеты будут уменьшены ... поскольку более поздние транзакции, скорее всего, будут редактироваться чаще, а более старые - редко. Он также будет распространять вычисления на записи так, чтобы чтение находилось почти мгновенно.

Может ли кто-нибудь помочь в настройке такого триггера?

до сих пор это то, что у меня есть, но оно не дает желаемых результатов. И пересчитывает все каждый раз. Не только те, кто следует за изменением.

CREATE TRIGGER RunningTotal AFTER UPDATE ON Transactions FOR EACH ROW 
BEGIN 
    UPDATE Transactions 
     SET RunningBalance = (
     SELECT (
        SELECT sum(Amount) 
        FROM TopInfo t2 
        WHERE t2.Date <= t1.Date 
       ) 
      FROM Transactions t1 
    ); 
END; 

Спасибо!

ответ

0

Мне удалось найти способ, который работает. Не уверен, насколько он эффективен. Приятно слышать, знает ли кто-нибудь более эффективный способ обновить столбец «Баланс».

CREATE TRIGGER Balance AFTER UPDATE OF Amount ON Transactions FOR EACH ROW 
BEGIN 
    UPDATE Transactions 
     SET Balance = (
     SELECT Balance 
      FROM (
        SELECT TransactionID, 
          (
           SELECT sum(t2.Amount) 
           FROM Transactions t2 
           WHERE t2.Date <= t1.Date 
           ORDER BY Date 
         ) 
          AS Balance 
        FROM Transactions t1 
        WHERE TransactionID = Transactions.TransactionID 
        ORDER BY Date 
       ) 
    ) 
    WHERE Transactions.Date >= NEW.Date; 
END; 

UPDATE:

CREATE TRIGGER Balance AFTER UPDATE OF Amount ON Transactions FOR EACH ROW 
BEGIN 
    UPDATE Transactions 
     SET Balance = (
     SELECT Balance 
      FROM (
        SELECT TransactionID, 
          (
           SELECT sum(t2.Amount) 
           FROM Transactions t2 
           WHERE CASE WHEN t2.Date = t1.Date THEN t2.TransactionID <= t1.TransactionID ELSE t2.Date <= t1.Date END 
           ORDER BY Date, 
             TransactionID 
         ) 
          AS Balance 
        FROM Transactions t1 
        WHERE TransactionID = Transactions.TransactionID 
        ORDER BY Date, 
          TransactionID 
       ) 
    ) 
    WHERE Transactions.Date >= NEW.Date; 
END; 

Я сделал несколько больше с нарастающим итогом и придумали 2-мя способами. Второй - намного медленнее первого. Любые идеи, почему ???

Метод 1

SELECT TransactionID,Date, Account, Amount, 
(SELECT sum(t2.Amount) 
FROM Transactions t2 
WHERE 
CASE WHEN t2.Date = t1.Date 
THEN t2.TransactionID <= t1.TransactionID 
AND t2.Account == t1.Account 
ELSE t2.Date <= t1.Date 
AND t2.Account == t1.Account 
END 
ORDER BY Date, TransactionID) 
AS Balance 
FROM Transactions t1 
    ORDER BY Date, TransactionID 

Method2

SELECT n.TransactionID, n.Date, n.Account, n.Amount, 
SUM(o.Amount) As running_total 
FROM Transactions n LEFT JOIN Transactions o 
ON (
CASE WHEN o.Date = n.Date 
THEN n.TransactionID >= o.TransactionID 
AND o.Account == n.Account 
ELSE n.Date >= o.Date 
AND o.Account == n.Account 
END 
) 
GROUP BY n.Account, n.Date, n.TransactionID 
ORDER BY n.Date, n.TransactionID; 
+0

Я нашел проблему. Когда две транзакции имеют одну и ту же дату, но другой идентификатор транзакции. Они получают одинаковый баланс – Gavin

+0

Исправлено обновление – Gavin

Смежные вопросы