5

タイトルがあいまいで申し訳ありません。検索方法がわからないか、この質問をしてください。

TableAがあるとしましょう:

RowIDFkIdランク日付
ID1 A 1 2013-3-1
ID2 A 2 2013-3-2
ID3 A 2 2013-3-3
ID4 B 3 2013-3-4
ID5 A 1 2013-3-5

FkIdごとに1行を返すビューを作成する必要があります。行は最大ランクと最大日付である必要があります。したがって、FkId "A"の場合、クエリは"ID3"の行を返します。

サブクエリを使用して単一の行を返すことができました。最初にMAX(Rank)を取得し、次にFkIdとRankでMAX(Date)グループを取得する別のクエリに参加します。

SELECTTableA。*
(FkId、MAX(Rank)ASランクをTableA GROUP BY FkIdから選択)s1
内部結合(FkId、Rank、MAX(Date)AS Date FROM TableA GROUP BY FkId、Rankを選択)s2 ON s1.FkId = s2.FkId AND s1.Rank = s2.Rank
s2.FkId = TableA.FkId AND s2.Rank = TableA.Rank AND s2.Date=TableA.Dateの内部結合TableA

同じ結果を達成するより効率的なクエリはありますか?見てくれてありがとう。

編集:最後の回答以降にID5を追加しました。通常のMAX(rank)、MAX(Date)GROUP BY FkIdを試した場合、「A」の場合はAになります。2; 2013-3-5。この結果は、RowIdと一致しません。

4

4 に答える 4

4

CTEROW_NUMBERで使用できます(sql-server> = 2005を想定):

WITH CTE AS
(
   SELECT TableA.*,
      RN = ROW_NUMBER() OVER (PARTITION BY FkId Order By Rank Desc, Date DESC)
   FROM Table A
)
SELECT RowID,FkId, Rank,Date
FROM CTE WHERE RN = 1
于 2013-03-25T21:10:02.813 に答える
2

あなたの質問(この回答へのコメントで明らかにされています)は以下を求めています:

  1. FkIdごとに1行
  2. 最大日付とランク
  3. 元のデータの行に対応する結果。

最大日付と最大ランクが別々の行にあるような行を持つFkIdがある場合は、これらの要件の少なくとも1つを緩和する必要があります。

要件(3)を緩和する場合は、次を使用できますGROUP BY

SELECT FkId, MAX(Rank) AS Rank, Max(Date) AS Date
FROM TableA
GROUP BY FkId

コメントに追加情報があります。各FkIdの最高ランクのエントリの最新のものが必要な場合は、次のように機能するはずです。

SELECT FkId, Rank, MAX(Date) AS Date
FROM TableA A
WHERE Rank = (SELECT MAX(Rank) 
              FROM TableA sub 
              WHERE A.FkId = sub.FkId 
              GROUP BY sub.FkId)
GROUP BY FkId, Rank

これが実際の動作を示すsqlfiddleです。

于 2013-03-25T21:05:45.467 に答える
1

あなたはそれを達成するためにRank()とインラインクエリを使うことができます。


select * from TableA
where RowID in (
      select rowID from (
           select FKID, RowID, 
                  rank() over (partition by FKID order by [Rank] desc, [Date] desc) as RankNumber
                  from TableA ) A
      where A.RankNumber=1 ) 

SQLフィドルデモ

于 2013-03-25T21:48:37.900 に答える
0

また、卑劣で、ljhが次のように提案したことを達成することもできます:

select top 1 with ties *
from TableA
order by rank() over (
  partition by FKID
  order by [Rank] desc, [Date] desc
)
于 2013-03-25T23:10:04.277 に答える