这是我的数据库结构 create database testGroupfirst; 去
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
这是迄今为止的结果
我通过
创建了一个简单的组按名称,年份,学位,地点从testTbl组中选择姓名,年份,学位,地点
如图2所示 - 我想获得第一个用户的数据和第一年的详细描述 - 光标可以做到,但我不想使用它,我认为有很多方法可以更好的方式处理这种情况,如交叉应用或cte。 我在这里找到了一个相关问题 Get top 1 row of each group 但这在我的情况下不起作用,或者我无法应用它,所以我在这里提出了这个新问题。
所以我需要从每个组(用户)获取第一行(前1名),并希望获得第一条记录,并且必须包含用户在其中工作的第一年(按desc排序)
答案 0 :(得分:1)
使用ROW_NUMBER
:
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;
如果你想考虑返回联系的可能性,例如,一个给定的名字有两个或多个具有相同最低年份的记录,那么有很多选项。一种方法是为行号调用中使用的ORDER BY
子句添加其他条件,以打破平局。另一个选择是使用排名函数而不是行号,并返回所有关系。
答案 1 :(得分:1)
可能的解决方案之一是:
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;
更新:另一种解决方案(因为我和Tim发布了同样的内容)将使用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