1

これは私のデータベース構造 データベース作成testGroupfirst; は、これは私が条件ベースの結果ベース別グループの最初のレコードを取得

選択名、年、学位、名前でtestTblグループから場所、YEAR、程度によって、単純なグループを作成し、今

enter image description here

までの結果は

use testGroupfirst; 
go 

create table testTbl (

id int primary key identity,name nvarchar(50) ,year int ,degree int , place nvarchar(50) 

) 

insert into testTbl values ('jack',2015,50,'giza') 
insert into testTbl values ('jack',2016,500,'cai') 
insert into testTbl values ('jack',2017,660,'alex') 
insert into testTbl values ('jack',2018,666,'giza') 
insert into testTbl values ('jack',2011,50,'alex') 
insert into testTbl values ('rami',2015,5054,'giza') 
insert into testTbl values ('rami',2016,1500,'cai') 
insert into testTbl values ('rami',2017,66220,'giza') 
insert into testTbl values ('rami',2018,6656,'alex') 
insert into testTbl values ('rami',2011,540,'cai') 
insert into testTbl values ('jack',2010,50,'cai') 
select * from testTbl 

行きます、場所

enter image description here

図2に示すように - 最初のユーザーのデータと最初の年の詳細な説明を取得したい - カーソルはそれを作ることができましたが、私はそれを使いたくないと思っていました。状況をより良いやり方で処理するか、クロス・アプリケーションやcteのようにします。 ここで関連する質問が見つかりました Get top 1 row of each group これは私の状況では機能しません。または適用できないため、ここでこの新しい質問をしました。

ので、私は

答えて

2

可能な解決策の一つは次のとおりです。

select name, year, degree, place 
from 
(select 
    name, 
    year, 
    degree, 
    place, 
    row_number() over (partition by name order by year) rn 
from testTbl 
--group by name ,YEAR ,degree,place -- not really needed 
) r 
where rn = 1; 

UPDATE:(Iとティムの両方が同じに掲載するので)別の解決策CROSS APPLYを使用することです:

select t.* 
from testTbl t 
    cross apply (select top 1 id from testTbl where name = t.name order by year) r 
where t.id = r.id 
+1

あなたの最初のクエリのルックス私に間違っている。なぜここで行番号と共に 'GROUP BY'を使用していますか? –

+1

@TimBiegeleisen OPが持っていたクエリをコピーしました。しかし、あなたは絶対に正しいです、あなたは 'GROUP BY'を必要としません。そして、私はオプティマイザがそれを無視することさえ確信しています。 –

2

使用(DESC順)すべてのグループ(ユーザー)からの最初の行(上1)を取得する必要があり、最初のレコードを取得したいと必見は、ユーザーがそれで動作することを初年度含まれていROW_NUMBER:あなたは、例えば、与えられた名前が同じ最低の年を持つ2つの以上のレコードを持つ必要があります返す結びつきの可能性を検討したい場合

SELECT name, year, degree, place 
FROM 
(
    SELECT name, year, degree, place, 
     ROW_NUMBER() OVER (PARTITION BY name ORDER BY year) rn 
    FROM testTbl 
) t 
WHERE rn = 1; 

、オプションの束があります。 1つは、行番号への呼び出しで使用されるORDER BY句に他の条件を追加して、結合を解除することです。もう1つの選択肢は、行番号の代わりにランク関数を使用して、すべての結合を返すことです。

関連する問題