SQL: UPDATE de uma seleção complexa

Em um cenário de sistema telefônico, tenho 2 tabelas.

A tabela1 é composta por:customer_id, call_duration, calldate, skip_billing .A tabela2 é composta por:customer_id, bonus_seconds.

A tabela1 armazena todas as chamadas para todos os clientes e a tabela2 armazena os bônus_segundos, que representam o tempo livre de conversação permitido para um cliente definido (ou seja: para o cliente 1, os PRIMEIROS 40 segundos cumulativos são gratuitos).

Eu tenho que escrever uma consulta para atualizar a tabela1 de acordo com a condição explicada abaixo: defina skip_billing dentro de chamadas que são definidas gratuitamente na tabela2.

Então, primeiro eu preciso agrupar por customer_id e, em seguida, iterar sobre as chamadas, incrementando uma variável cumulativa (cumsec) sobre a duração da chamada e definir skip_billing de acordo.

O exemplo da tabela1 é:

|sqlid |customer_id |billsec | skipbill|
|0     |1           |12      | 1       |<--need to set 1 due to cume=12 for customer_id=1
|1     |1           |10      | 1       |<--need to set 1 due to cume=22 for customer_id=1
|2     |1           |15      | 1       |<--need to set 1 due to cume=37 for customer_id=1
|3     |1           |8       | 0       |<--nop(no operation) due to cume=45
|4     |2           |12      | 1       |<--need to set 1 due to cume=12 for customer_id=2
|5     |3           |12      | 1       |<--need to set 1 due to cume=12 for customer_id=3
|6     |2           |12      | 0       |<--nop due to cume=24 for customer_id=2
|7     |1           |12      | 0       |<--nop due to cume=49 for customer_id=1
|8     |3           |15      | 0       |<--nop due to cumsec=27 for customer_id=3

|customer_id |bonus_seconds|
|1           |40           |
|2           |20           |
|3           |15           |

Eu tentei com consulta como esta (graças a Gordon Linoff) que retorna o conjunto correto de linhas:

    SELECT t.cume, t.calldate, t.customer_id FROM (SELECT t.*, (@cume := @cume + billsec) AS cume FROM table1 t CROSS JOIN (SELECT @cume := 0) vars ORDER BY calldate) t, table2 sct WHERE t.cume <= sct.bonus_seconds AND t.customer_id=sct.customer_id ;

Mas quando eu tento usar dentro do comando UPDATE como abaixo, ele não funciona porque não corresponde a nada.

    UPDATE table1 SET skipbill=1 WHERE sqlid=(SELECT t.sqlid FROM (SELECT t.*, (@cume := @cume + billsec) AS cume FROM table1 t CROSS JOIN (SELECT @cume := 0) vars ORDER BY calldate) t, table2 sct WHERE t.cume <= sct.bonus_seconds AND t.customer_id=sct.customer_id ) ;

Como posso escrever a tarefa de atualização usando essa consulta ou algo melhor?

Agradeço antecipadamente

questionAnswers(2)

yourAnswerToTheQuestion