1

サイトでのユーザー アクションをキャプチャするログがあります。これは、ホームページでユーザーに表示されます。アクションは、ページの追加、ページへのいいね、ページの更新などの形式を取ることができます。

「John Smith がテスト ページを更新しました」</p>

これらのアクションをグループ化するよう求められたので、同じ日に同じページを更新するための 20 の異なるエントリではなく、1 つのエントリが表示されます。

「John Smith と他の 20 人がテスト ページを更新しました」</p>

理想的には、表示される名前はそのアクションを最後に実行した人物であるため、他の誰かが同じページを同じ日に更新した場合、次のようになります。

「Steve Jones と他の 21 人がテスト ページを更新しました」</p>

このようなすべての種類のアクションをグループ化するのではなく、一部のみをグループ化します。異なるパースペクティブ (つまり、John Smith には "John Smith" ではなく "You" が表示される) が別のテーブルに格納されることは、さらに複雑です。

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 デモ。さらに変更を加えたり、他のユーザーが 1 人しかいない場合は「others」を「other」に変更したりできます。

于 2013-10-17T14:38:35.877 に答える