你不说你想要的结果做什么,但你可以当然选择用户的最早的每天十个投标:
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;
回应评论:
你说你希望将其添加到用户的bidcount,但bidcount是不是在你的任何表的列名。也许你的意思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不允许使用CTE进行更新,并且我没有确认T-SQL的古怪UPDATE .. FROM可以与CTE结合使用。
在任何情况下,考虑到这似乎是更新的类型,您只会偶尔运行,而不会同时运行,因此将我的第一个建议(以您的目的为准)的结果插入临时表中是最明智的选择,根据你的更新。
您可能想要接受超过1/3问题的答案。那些竭尽全力帮助你的人通常会被你实际接受他们的答案的机会激发出来。 – 2009-10-26 04:01:21
亚伦,我现在要为过去做这件事,我必须回去你的权利!我真的很感谢这里的帮助。 – mrblah 2009-10-26 14:43:43