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

6

我正在尝试执行此查询。这是我的查询语句:

我的数据表为: Table

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

任何时候,如果成功没有到来,我知道我缺少了某些东西...但不知道是什么? 提前感谢!!!


将查询中的“GROUP BY EF.EstudioID, NC.Anyo”更改为“GROUP BY T.StudyID, T.Year”。 - Jorge Campos
我会在末尾添加 HAVING Max(Year)。 - Alec.
1
这在SQL Server中是不允许的 :( - user2112420
这个回答解决了你的问题吗?获取每个分组的前1行 - Michael Freidgeim
3个回答

10
您可以使用 GROUP BY 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

ROW_NUMBER 用于根据 Year 值为每个 StudyID 组分配排序编号。具有最大 Year 值的行被分配一个 rn = 1


是的,你说得对,我之前就是这样做的,但是做错了什么。谢谢。 - user2112420

0

试试这个:

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中它提供了你想要的结果,但是在SQL-Server中可能需要一些别名,我不确定。现在无法进行测试。


我认为你需要将 T.Year 添加到 GROUP BY 列表中。 - Tab Alleman
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jorge Campos
不必要认为distinct子句是多余的,在这种情况下,它将完成与按年份分组相同的工作。 - Pinx0
在使用GROUP BY时,distinct是100%多余的。使用GROUP BY时不可能获取重复行。 - t-clausen.dk
@t-clausen.dk 但是我没有按年份分组,所以如果有两个年份的year = MAx(year),它将生成2行完全相等的行。虽然这是真的,但是SQL Server不会承认该查询,因为Year没有被分组,也没有MAXed、MINed或SUMed,但SQLite可以,并且可以工作。 - Pinx0

0

这将给出您想要的答案

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

我没有50个声望来评论Pinx0,我只是修改了他的查询并发布为单独的帖子。 - bonzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接