私のCTEに関して正しいロジックに到達するのには苦労しています。CTE行番号の分割
いくつかの背景情報:
タスクが販売役割を持っているすべてのメンバーのためのシステムで生成されます。これは基本的に私のTask
テーブルに複数のレコードを挿入します。 [タスク]タブには、AssignedTo
とRequestedBy
という列があります。AssignedTo
には、それぞれの販売メンバーIDがあります。誰もがそれを主張していないため、現在、すべての営業担当者は、タスクを見ることができます:
ApprovalStatusId EntityType EntityId AssignedTo RequestedBy
18 | FooBar | 281 | 4 | 6
18 | FooBar | 281 | 9 | 6
18 | FooBar | 281 | 17 | 6
18 | FooBar | 281 | 26 | 6
18 | FooBar | 281 | 39 | 6
AssignedTo
だけでなく、タスクのステータスを変更しますタスク、:
ApprovalStatusId EntityType EntityId AssignedTo RequestedBy
18 | FooBar | 281 | 4 | 6
18 | FooBar | 281 | 9 | 6
18 | FooBar | 281 | 17 | 6
18 | FooBar | 281 | 26 | 6
18 | FooBar | 281 | 39 | 6
17 | FooBar | 281 | 26 | 6
1 | FooBar | 281 | 6 | 6
あなたは上記の表からわかるように、使用者26がタスクに反応して、ステータスを変更しました。これが完了すると、システムはタスクを元の要求されたユーザー6にリダイレクトしました。ステータスもこのアクションを示すように変更されました。
問題:
へ:現在
- 、一つだけのユーザ(同上4)は、私が試したどのようなすべての販売ユーザー
に割り当てられたタスクを見て住所#1:
;WITH cte AS
(
SELECT task.*, stat.Name AS StatusName,
ROW_NUMBER() OVER (PARTITION BY EntityId, EntityType ORDER BY ModifiedData DESC) AS rn
FROM dbo.Task task
INNER JOIN dbo.ApprovalStatus stat on task.ApprovalStatusId = stat.ApprovalStatusId
)
SELECT *
FROM cte
WHERE AssignedTo = @resourceId
AND StatusName like 'Pending%'
AND rn = 1
したがって、このSQLの問題の1つはAND rn = 1
です。これがポイント1で発生した問題の原因ですが、削除してステータスを変更すると、最新のタスク項目が取得されません。一方、この問題も発生します。
パーティショニングをPARTITION BY EntityId, EntityType, AssignedTo ORDER BY ModifiedData DESC
に変更しようとしましたが、問題は、ほとんどの場合rn
が1になります。これは売上に基づいて正しい結果を生成しませんグループ。
[更新]:
サンプルデータ:
Comments InsertDate ModifiedData CommentUserId ApprovalStatusId EntityType EntityId TenantId AssignedTo RequestedBy
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |4 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |6 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |9 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |17 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |26 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |39 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |67 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |10073 |42
... | 2017-03-20 11:18:06.343| 2017-03-20 11:18:06.343| NULL | 18 | FooBar | 75 |7 |10164 |42
所望の出力:タスクは唯一であるべき主張
販売ユーザーそれを見ることができる人。言い換えれば、販売ユーザーは(第2のテーブルの例で見ることができる)このレコードを見ることができるはず - 他のすべての販売ユーザーが何も見えないはずです
17 | FooBar | 281 | 26 | 6
ここで作業しているスキーマといくつかのテストデータを追加できますか?あなたの質問は、例えば、あなたのサンプルデータのどこにでも 'ModifiedData'カラムを持っていません。あなたは、サンプルデータに基づいて、それを説明しようとするのではなく、望ましい出力を追加してください。 – iamdave
ちょっと@iamdave、返事のおかげで。正直言って、それはかなり関わっているので、私はできる限りベストを打ち破ろうとします。 –
ここの日付の値が同じで、このデータをどのように注文していますか?これはあなたの部分の誤植ですか? – iamdave