SQL仅获取用户的最新记录

时间:2018-06-12 17:33:59

标签: sql sql-server

我有一种情况,我需要编写一个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

enter image description here

2 个答案:

答案 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)