我有一种情况,我需要编写一个SQL查询来获取课堂上学生的所有最新回复。我基本上只想展示他们最近的回复,而不是他们所有的回复。我有查询来获取所有回复并订购它们,但是我无法弄清楚它只能抓住该用户的最新记录。
以下是我到目前为止的查询。您可以从图像中的示例数据中看到它正在拉回所有响应。我基本上想要的只是特定学生的最新版本,或者可能只显示特定课程/页码组合的最大尝试次数。我曾尝试过分区和分组,但我还没找到合适的组合。
SELECT U.UserName, C.Name AS 'ClassroomName', U.FirstName, U.LastName, L.Name AS 'LessonName', P.PageNumber, R.Attempt, R.Created
FROM Responses R
INNER JOIN ClassroomUsers CU ON CU.UserId = R.UserId
INNER JOIN Classrooms C ON C.Id = CU.ClassroomId
INNER JOIN Questions Q ON Q.Id = R.QuestionId
INNER JOIN Pages P ON P.Id = Q.PageId
INNER JOIN Lessons L ON L.Id = P.LessonId
INNER JOIN AspNetUsers U ON U.Id = CU.UserId
WHERE CU.ClassroomId IN (
SELECT CU.ClassroomId
FROM ClassroomUsers CU
WHERE CU.UserId = @UserId
)
ORDER BY R.Created DESC
答案 0 :(得分:1)
我最喜欢的方法是使用Row_Number()
,它会根据您设置的条件对每一行进行编号 - 在您的情况下,您需要按U.UserName
进行分区,因为您希望返回一行对于每个用户和订单R.Created DESC
以获取最新的用户。
在这种情况下,您只想取回RN=1
行,因此您可以按如下方式查询:
WITH cte AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY U.UserName ORDER BY R.Created DESC) AS RN
,U.UserName, C.Name AS 'ClassroomName', U.FirstName, U.LastName, L.Name AS 'LessonName', P.PageNumber, R.Attempt, R.Created
FROM Responses R
INNER JOIN ClassroomUsers CU ON CU.UserId = R.UserId
INNER JOIN Classrooms C ON C.Id = CU.ClassroomId
INNER JOIN Questions Q ON Q.Id = R.QuestionId
INNER JOIN Pages P ON P.Id = Q.PageId
INNER JOIN Lessons L ON L.Id = P.LessonId
INNER JOIN AspNetUsers U ON U.Id = CU.UserId
WHERE CU.ClassroomId IN (
SELECT CU.ClassroomId
FROM ClassroomUsers CU
WHERE CU.UserId = @UserId
)
)
SELECT * FROM cte WHERE RN = 1
希望有意义/有帮助!!
答案 1 :(得分:1)
另一种选择是使用 WITH TIES 子句。
示例强>
SELECT top 1 with ties
U.UserName
, C.Name AS 'ClassroomName'
, U.FirstName
, U.LastName
, L.Name AS 'LessonName'
, P.PageNumber
, R.Attempt
, R.Created
FROM Responses R
INNER JOIN ClassroomUsers CU ON CU.UserId = R.UserId
INNER JOIN Classrooms C ON C.Id = CU.ClassroomId
INNER JOIN Questions Q ON Q.Id = R.QuestionId
INNER JOIN Pages P ON P.Id = Q.PageId
INNER JOIN Lessons L ON L.Id = P.LessonId
INNER JOIN AspNetUsers U ON U.Id = CU.UserId
WHERE CU.ClassroomId IN (
SELECT CU.ClassroomId
FROM ClassroomUsers CU
WHERE CU.UserId = @UserId
)
Order By ROW_NUMBER() OVER(PARTITION BY U.UserName ORDER BY R.Created DESC)