1

我有一个记录我网站上的用户操作的日志;然后在主页上向用户显示。操作可以采取添加页面、点赞页面、更新页面等形式。

“John Smith 更新了测试页面”</p>

我被要求对这些操作进行分组,因此不是在同一天更新同一页面的 20 个不同条目,而是显示一个条目:

“John Smith 和其他 20 人更新了测试页面”</p>

理想情况下,显示的名称将是执行该操作的最后一个人,因此如果其他人更新了同一页面,则在同一天它将显示为:

“Steve Jones 和其他 21 人更新了测试页面”</p>

我不想把所有类型的动作都像这样分组,只有一些。更复杂的是,不同的视角(即 John Smith 会看到“You”而不是“John Smith”)存储在单独的表中。

我一直在努力了解如何通过 SP 实现这一目标,并且想知道这是否合理?我可以在后面的代码中确切地看到我将如何在 .net 中执行此操作,所以也许我应该采用这种方法?

非常欢迎您的想法。

4

1 回答 1

1

窗口功能将帮助您!:) 你可以这样做:

with cte as (
    select
        *,
        row_number() over(partition by page_id order by date asc) as rn,
        count(*) over(partition by page_id) as cnt
    from tasks
)
select
    user_name + isnull(' and ' + cast(nullif(cnt - 1, 0) as nvarchar(max)) + ' others', '') + ' ' +
    case
        when action = 'update' then 'updated'
    end + ' this page (id: ' + cast(page_id as nvarchar(max)) + ')'
from cte
where rn = 1

=>带有一些测试用例的 sql fiddle 演示。您可以进一步修改它,如果只有一个其他用户,则将“其他”更改为“其他”,依此类推。

于 2013-10-17T14:38:35.877 回答