Как вернуть запись, когда сумма достигла определенного порога - PullRequest
3 голосов
/ 04 февраля 2009

Я использую SQL, и у меня есть таблица с тремя столбцами: account ,action_date, Points. Каждая учетная запись будет иметь несколько транзакций_даты и очки, заработанные за каждую транзакцию.

Как вернуть дату транзакции, когда каждая учетная запись достигла определенного порогового значения (т.е. набрала 100 баллов). Скажем, на первом счете 2000 транзакций, а на первых пяти - 21 очко. Я бы хотел, чтобы запрос возвратил транзакцию № 5, потому что именно тогда счет достиг 100.

Кто-нибудь может помочь? Спасибо! Cat

Ответы [ 4 ]

2 голосов
/ 04 февраля 2009
select min(a.transaction_date), a.account from

(select sum(t1.points) as thesum, t2.transaction_date, t2.account 
from table t1
inner join table t2 on t1.account = t2.account and t1.transaction_date <= t2.transaction_date
group by t2.transaction_date, t2.account
having thesum >= 100) a 

group by a.account
1 голос
/ 04 февраля 2009

Используйте треугольное соединение:

В T-SQL:

SELECT account, MIN(dt), MIN(points) 
FROM 
(
    SELECT t1.account, t1.date, sum(t2.points) AS points
    FROM table t1
      INNER JOIN table t2 ON t1.account = t2.account AND t1.dt >= t2.dt
    GROUP BY t1.account, t1.date
    HAVING SUM(t2.points) > 100
) iq
GROUP BY account
0 голосов
/ 04 февраля 2009

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

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

0 голосов
/ 04 февраля 2009

Это должно дать вам то, что вы ищете.

SELECT account_id, MIN(transaction_date) FROM table t1 WHERE (SELECT SUM(points) FROM table t2 WHERE t2.transaction_date < t1.transaction_date) <= 100 GROUP BY account_id

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