Вы не говорите, что хотите сделать с результатами, но вы, безусловно, можете ВЫБРАТЬ самые ранние десять заявок пользователя в день:
with ProductBidsRanked(productID, userID, Created, rk) as (
select
productID, userID, Created,
row_number() over (
partition by userID, dateadd(datediff(day,0,Created),0)
order by Created
)
)
select productID, userID, Created
from ProductBidsRanked
where rk <= 10
Конечно, если вам нужна только общая сумма и вы хотите заменить ее на 10, если она превышает 10, это проще:
with PartialAgg(userID,countOr10) as (
select
userID,
case when count(*) > 10 then 10 else count(*) end
from ProductsBids
group by userID, dateadd(datediff(day,0,Created),0)
)
select
userID, sum(countOr10) as BidsAdjusted
from PartialAgg
group by userID;
Ответ на комментарий:
Вы говорите, что хотите добавить его в учетную ставку пользователя, но ставка не является именем столбца ни в одной из ваших таблиц. Возможно, вы имели в виду TOTALBIDS, поэтому, например, если для вас работает второй запрос, вы можете сделать что-то вроде этого:
with PartialAgg(userID,countOr10) as (
select
userID,
case when count(*) > 10 then 10 else count(*) end
from ProductsBids
group by userID, dateadd(datediff(day,0,Created),0)
), FullAgg(userID,BidsAdjusted) as (
select
userID, sum(countOr10) as BidsAdjusted
from PartialAgg
group by userID
)
update users set
TOTALBIDS = TOTALBIDS + BidsAdjusted
from users join FullAgg
on FullAgg.userID = users.userID
К вашему сведению, здесь есть кое-что специфическое для SQL Server - ANSI не допускает UPDATE с CTE, и я не подтвердил, что изворотливое UPDATE T-SQL ... FROM можно использовать в сочетании с CTE.
В любом случае, учитывая, что это похоже на тот тип обновления, который вы запускаете только нечасто и никогда одновременно, может быть целесообразно вставить результаты моего первого предложения (в зависимости от того, что вам нужно) во временную таблицу и базу Ваше обновление на этом.