0

上記の sql ステートメントを実行すると、これが得られました。 3 と 4 を参照してください。caseid 3 の場合、2012-12-20 16:12:36.000 である最新の行が表示されます。group by、order by を使ってみました。グーグルのいくつかのウェブサイトはランクを使用すると言っていましたが、実際にランクを取得していないため、ランクについてはわかりません。いくつかの提案?

select [Case].CaseID, Agent.AgentName, Assignment.Description, A.AgentName as EditedBy, A.DateEdited from Agent inner join [Case-Agent] on [Case-Agent].AgentID = Agent.AgentID inner join [Assignment] on Assignment.AssignmentID = [Case-Agent].AssignmentID inner join [Case] on [Case].CaseID = [Case-Agent].CaseID inner join (select EditedCase.CaseID, [EditedCase].DateEdited, [Agent].AgentName from EditedCase inner join [Agent] on [Agent].AgentID = [EditedCase].AgentID) A on A.CaseID = [Case].CaseID where [Assignment].AssignmentID = 0 
4

2 に答える 2

0

あなたは正しい道を歩んでいました。ここでランキング関数を使用する必要があります。たとえば、次のようになりますrow_number()

with LatestCase as
(
  select [Case].CaseID
    , Agent.AgentName
    , Assignment.Description
    , A.AgentName as EditedBy
    , A.DateEdited
    , caseRank = row_number() over (partition by [Case].CaseID order by A.DateEdited desc)
  from Agent
    inner join [Case-Agent] on [Case-Agent].AgentID = Agent.AgentID
    inner join [Assignment] on Assignment.AssignmentID = [Case-Agent].AssignmentID
    inner join [Case] on [Case].CaseID = [Case-Agent].CaseID
    inner join
    (
      select EditedCase.CaseID
        , [EditedCase].DateEdited
        , [Agent].AgentName
      from EditedCase
        inner join [Agent] on [Agent].AgentID = [EditedCase].AgentID
    ) A on A.CaseID = [Case].CaseID where [Assignment].AssignmentID = 0
)
select *
from LatestCase
where caseRank = 1
于 2012-12-20T09:20:05.903 に答える
0

RANK を使用してそれを行うには、RANK をサブクエリに追加し、CaseID と Agent ごとに DateEdited をランク付けしてから、メインクエリに WHERE 句を配置して、ランクが 1 の行のみを選択する必要があります。パーティション句を正しく取得しました-データが表示されないのは少し難しいです。

このような:

SELECT 
  [Case].CaseID 
  ,Agent.AgentName 
  ,Assignment.Description 
  ,A.AgentName AS EditedBy 
  ,A.DateEdited 
FROM Agent 
  INNER JOIN [Case-Agent] ON [Case-Agent].AgentID = Agent.AgentID 
  INNER JOIN [Assignment] ON Assignment.AssignmentID = [Case-Agent].AssignmentID 
  INNER JOIN [Case] ON [Case].CaseID = [Case-Agent].CaseID 
  INNER JOIN (SELECT 
                EditedCase.CaseID 
                ,[EditedCase].DateEdited 
                ,[Agent].AgentName
                ,RANK ( ) OVER (PARTITION BY EditedCase.CaseID, [Agent].AgentName 
                               ORDER BY [EditedCase].DateEdited DESC ) AS pos
              FROM EditedCase 
                INNER JOIN [Agent] on [Agent].AgentID = [EditedCase].AgentID) A on A.CaseID = [Case].CaseID 
WHERE [Assignment].AssignmentID = 0 
  AND pos = 1

次のように、サブクエリを集計クエリに変更して、MAX の日付を戻すこともできます。

SELECT 
  [Case].CaseID 
  ,Agent.AgentName 
  ,Assignment.Description 
  ,A.AgentName AS EditedBy 
  ,A.DateEdited 
FROM Agent 
  INNER JOIN [Case-Agent] ON [Case-Agent].AgentID = Agent.AgentID 
  INNER JOIN [Assignment] ON Assignment.AssignmentID = [Case-Agent].AssignmentID 
  INNER JOIN [Case] ON [Case].CaseID = [Case-Agent].CaseID 
  INNER JOIN (SELECT 
                EditedCase.CaseID 
                ,MAX([EditedCase].DateEdited) AS DateEdited 
                ,[Agent].AgentName
              FROM EditedCase 
                INNER JOIN [Agent] on [Agent].AgentID = [EditedCase].AgentID
              GROUP BY
                EditedCase.CaseID
                ,[Agent].AgentName) A on A.CaseID = [Case].CaseID 
WHERE [Assignment].AssignmentID = 0 
  AND pos = 1
于 2012-12-20T09:17:46.140 に答える