/ /複数の列の集計に基づいて単一の行を返すにはどうすればよいですか-sql、sql-server、tsql

複数の列(sql、sql-server、tsql)の集計に基づいて単一の行を返すにはどうすればよいですか?

タイトルがあいまいで、検索方法がわからない、またはこの質問をしてすみません。

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)グループを取得する別のクエリに参加します。

TableAを選択します。* (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と一致しません。

回答:

回答№1は4

あなたは使うことができます ROW_NUMBER とともに CTE (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

回答№2については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で実際の動作を表示.


回答№3の場合は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 Fiddleデモ


回答№4の場合は0

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

select top 1 with ties *
from TableA
order by rank() over (
partition by FKID
order by [Rank] desc, [Date] desc
)