Завершение вложенного контекста после первого вывода - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть игра, в которой я пытаюсь реализовать функцию счастливого часа, в которой, если вы зарабатываете определенное количество баллов, в течение определенного периода времени каждый день вы что-то зарабатываете. Событие должно срабатывать только один раз в час, как только игрок выполнит требование очков.

Я испробовал несколько разных решений:

create context HappyHourContext
    context InitCtx start (0, 16, *, *, *) end pattern[timer:at(0, 17, *, *, *) or TerminationEvent],
    context PartitionCtx partition by playerId from EarnPointsEvent, playerId from TerminationEvent;
 context HappyHourContext
     insert into TerminationEvent select playerId from EarnPointsEvent having sum(points) >= 100;

Это работает только для первого игрока из-за того, что TerminationEvent не учитывает раздел.

Следующий запрос, кажется, работает правильно, однако он выглядит довольно неэффективным, поскольку он обрабатывает события даже после его вывода.

create context HappyHourContext
    context InitCtx start (0, 16, *, *, *) end (0, 17, *, *, *),
    context PartitionCtx partition by playerId from EarnPointsEvent);

 context HappyHourContext
     select playerId from EarnPointsEvent having sum(points) >= 100 output first every 1 hours

Есть ли способ завершить контекст после вывода первого события? или лучший способ сделать это?

Редактировать:

Я также пытался

create context HappyHourContext
    context InitCtx start (0, 16, *, *, *) end (0, 17, *, *, *),
    context PartitionCtx partition by playerId from EarnPointsEvent, playerId from TerminationEvent terminated by TerminationEvent;

 context HappyHourContext
     insert into TerminationEvent select playerId from EarnPointsEvent having sum(points) >= 100;

К сожалению, это выводит несколько событий на игрока из-за того, что InitCtx не завершается когда PartitionCtx равен.

1 Ответ

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

«Разделение» также принимает «прекращено». do c

Для однострочного вывода используйте функции агрегирования и / или предложения group-by, т.е. «group by playerId» или «last (playerId)». Выбирая поле события, выводится строка за событием, а не строка за группой. сделать c

...