SQL Server分组查询选择每个组的第一行

SQL Server分组查询选择每个组的第一行,sql,sql-server,Sql,Sql Server,我正在尝试做这个查询。这就是我所拥有的 我的桌子是:桌子 StudyID FacultyID Year Access1 Access2 Access3 1 1 2014 4 8 5 1 2 2014 8 4 7 1 1 2013 5 4 4 2

我正在尝试做这个查询。这就是我所拥有的

我的桌子是:桌子

StudyID FacultyID Year    Access1   Access2    Access3
1          1       2014       4        8          5
1          2       2014       8        4          7
1          1       2013       5        4          4
2          3       2014       4        6          5
2          5       2013       5        8         10
2          4       2014       5        5          7
3          7       2013       9        4          7
我想按StudyID和Year分组,得到每个字段Access1 Access2和Access3的最小值,只显示上一年,我的意思是每个组的第一行。 结果如下

StudyID  Year    Access1   Access2    Access3
1        2014       4        4          5
2        2014       4        5          5
3        2013       9        4          7
这是我的疑问:

SELECT DISTINCT T.StudyID, T.Year, MIN(T.Access1), MIN(T.Access2), MIN(T.Access3)
FROM T
GROUP BY T.StudyID, T.Year
ORDER BY T.StudyID, T.Year DESC
我也试过这个

 ;WITH MyQuery AS (     SELECT DISTINCT T.StudyID, T.Year, MIN(T.Access1), MIN(T.Access2), MIN(T.Access3),ROW_NUMBER() OVER (PARTITION BY T.StudyID, T.Year ORDER BY T.StudyID, T.Year DESC) AS rownumber
    FROM T  GROUP BY T.StudyID, T.Year      ORDER BY T.StudyID , T.Year DESC ) SELECT * FROM MyQuery WHERE rownumber = 1
任何成功,我知道我错过了一些东西…但不知道什么? 提前感谢

试试这个:

SELECT DISTINCT T.StudyID, T.Year, MIN(T.Access1), MIN(T.Access2), MIN(T.Access3)
FROM myTable T
WHERE T.Year = (SELECT MAX(T2.Year) FROM myTable T2 WHERE T2.StudyID = T.StudyID)
GROUP BY T.StudyID

它在SQLite中给出了您想要的结果,但在SQLServer中可能需要一些别名,我不确定。现在无法测试。

您可以
按StudyID,Year
分组,然后在外部查询中从每个
StudyID,Year
组中选择第一行:

SELECT StudyID, Year, minAccess1, minAccess2, minAccess3
FROM (
   SELECT StudyID, Year, min(Access1) minAccess1, min(Access2) minAccess2,
          min(Access3) minAccess3, 
          ROW_NUMBER() OVER (PARTITION BY StudyID ORDER BY Year DESC) AS rn 
   FROM mytable
   GROUP BY StudyID, Year ) t
WHERE t.rn = 1

行编号
用于根据
年份
值为每个
StudyID
组分配一个订购编号。具有最大
年份
值的行被分配一个
rn=1

这是您想要的答案

SELECT DISTINCT T.StudyID, T.Year, MIN(T.Access1) as Access1, MIN(T.Access2) as Access2, MIN(T.Access3) as Access3
FROM T T
WHERE T.Year = (SELECT MAX(T2.Year) FROM T T2 WHERE StudyID = T.StudyID)
GROUP BY T.StudyID, T.Year
Order by 1

将您的分组依据从查询时的
group by EF.estudiod,NC.Anyo
更改为
group by T.StudyID,T.Year
我会将Max(Year)添加到末尾。这在SQL server中是不允许的:(我认为您需要将T.Year添加到GROUP BY列表中。GROUP BY应该是
T.StudyID,T.Year
,不需要DISTINCT子句。sqlserver上的GROUP BY将是强制性的。在这种情况下,DISTINCT子句不是不必要的,它将执行与本例中的GROUP BY相同的工作。使用GROUP BY时,DISTINCT是100%冗余的。)。使用组时,无法获取重复的行BY@t-但是我没有按年份分组,所以如果有2年的同一年=最大(年),它将生成完全相等的两行。不过,确实,sql server不会承认该查询,因为年份没有分组、最大化、挖掘或汇总,但SQLite确实如此,并且有效。我没有50%的声誉来评论Pinx0,我只是修改了他的查询并作为单独的帖子发布。是的,我是这样做的,但做了一些事情谢谢