You didn't specify your DBMS, but this is ANSI (standard) SQL:
with summed as (
select name,
date,
sum(deposit) over (partition by name order by date) as deposit
from players
)
select s1.*
from summed s1
where s1.total_deposit > 100
and s1.date = (select min(date)
from summed s2
where s2.name = s1.name
and s2.total_deposit > 100)
order by name;
It seems that (at least with Postgres) this is more efficient (but with such a tiny data set this is really hard to tell):
with summed as (
select name,
date,
sum(deposit) over (partition by name order by date) as deposit
from players
), numbered as (
select s1.*,
row_number() over (partition by name order by date) as rn
from summed s1
where s1.deposit >= 100
)
select name, date, deposit
from numbered
where rn = 1
order by name;
SQLFiddle example: http://sqlfiddle.com/#!15/d4590/13
But Uri's solution is probably still more efficient with proper indexing.
Btw: date
is a horrible name for a column. For one because it is a reserved word, but more importantly it doesn't document what the column contains. A "played date"? A "due date"? A "deposit date"? A "valid until" date?