SQL: ОБНОВЛЕНИЕ от сложного выбора

В сценарии телефонной системы у меня есть 2 таблицы.

Таблица1 состоит из:customer_id, call_duration, calldate, skip_billing .Таблица2 состоит из:customer_id, bonus_seconds.

В table1 хранятся все вызовы для всех клиентов, а в table2 хранятся bonus_seconds, представляющие свободное время разговора, разрешенное для определенного клиента (т. е. для клиента 1 первые 40 накопленных секунд бесплатны).

Я должен написать запрос на обновление table1 в соответствии с условием, описанным ниже: установите skip_billing в вызовах, которые определены бесплатно в table2.

Поэтому мне сначала нужно сгруппировать по customer_id, а затем выполнить итерации по вызовам, увеличивая кумулятивную переменную (cumsec) над call_duration и соответственно устанавливая skip_billing.

Пример таблицы1:

|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           |

Я попытался с запросом, как это (спасибо Гордон Линофф), который возвращает правильный набор строк:

    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 ;

Но когда я пытаюсь использовать команду UPDATE, как показано ниже, она не работает, потому что ничего не совпадает.

    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 ) ;

Как я могу написать задачу обновления, используя этот запрос или что-то лучше?

заранее спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос