Промежуточный итог - найдена дата промежуточного итога X - PullRequest
2 голосов
/ 07 февраля 2020

Мне нужно выяснить, у каких игроков (CID) есть депозит в сумме 100 или более, и точную дату, когда они достигли этой суммы.

Таблица депозитов:

CID        DATE        Deposit_Amount
===        =====       ===============
1234       1/6          20
2345       5/6          30
1234       16/6         1
1234       18/6         50
3456       19/6         18
1234       25/6         150 
2345       31/7         50
2345       1/8          18
3456       1/9          50 
1234       5/9          23
3456       5/10         33

Ответ должно быть:

CID    Date
===    ====
1234   25/6
3456   5/10

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

SELECT [CID]
      ,[Date]
      ,deposit 
      ,SUM([Deposit])OVER(PARTITION BY CID ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Total_deposit
  FROM [ISC_RAS_CD_MAXDB].[dbo].[Deposits]

любое предложение ? Спасибо!

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Рассмотрим:

select cid, min(date)
from (
    select t.*, sum(deposit_amount) over(partition by cid order by date) sum_deposit_amount
    from mytable t
) t
where sum_deposit_amount >= 100
group by cid

Подзапрос делает сумму окна deposit_amount за cid над date; затем внешний запрос агрегируется на cid и выбирает минимум, в котором сумма окна равна или выше 100.

0 голосов
/ 07 февраля 2020

Вы можете сделать это без агрегирования - при условии, что значения всегда положительны:

select cid, date
from (select t.*,
             sum(deposit_amount) over(partition by cid order by date) sum_deposit_amount
      from mytable t
     ) t
where sum_deposit_amount >= 100 and
      sum_deposit_amount - deposit_amount < 100;

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

...