从每组的3个表中选择SQL中具有最新日期的行

问题描述 投票:0回答:1

我正在为我的应用创建排名系统,请看我已经的图片https://i.imgur.com/beH555O.jpg我有一个问题,如何为每个“ QuizId”列选择最新日期为“ Taken On”列表的sql行,在此之前,我了解了如何选择它,但是仅使用一个表,我从中学习select rows in sql with latest date for each ID repeated multiple times这是我已经尝试过的内容

SELECT mAttempt.Id as Id 
      ,mAttempt.QuizModelId as QuizId
      ,mAttempt.StartedAt as StartsOn
      ,mUser.UserName 
      ,mDetail.Score as Score
FROM UserQuizAttemptModels mAttempt, AspNetUsers mUser, QuizAttemptDetailModels mDetail
WHERE mAttempt.UserId=muser.Id and mAttempt.QuizModelId=10053  and mDetail.UserQuizAttemptModelId = mAttempt.Id

我在这里感到困惑的是如何从3个表中选择它,希望您能对我有所帮助,当然,我需要具有良好查询和高效能的解决方案,谢谢

sql
1个回答
0
投票

如果您想获取“每个QuizId的最新行”-听起来您需要具有ROW_NUMBER()值的CTE(公用表表达式)-像这样:

WITH BaseData AS
(
    SELECT 
        mAttempt.Id AS Id,
        mAttempt.QuizModelId AS QuizId,
        mAttempt.StartedAt AS StartsOn,
        mUser.UserName,
        mDetail.Score AS Score,
        RowNum = ROW_NUMBER() OVER (PARTITION BY mAttempt.QuizModelId ORDER BY mAttempt.TakenOn DESC)
    FROM 
        UserQuizAttemptModels mAttempt
    INNER JOIN 
        AspNetUsers mUser ON mAttempt.UserId = muser.Id
    INNER JOIN
        QuizAttemptDetailModels mDetail ON mDetail.UserQuizAttemptModelId = mAttempt.Id
)
SELECT *
FROM BaseData
WHERE QuizId = 10053  
  AND RowNum = 1

BaseData CTE基本上选择了数据(就像您所做的一样)-但它也添加了ROW_NUMBER()列。这将基于QuizModelId将您的数据“划分”为数据组,并将对每个数据组内的所有行进行编号,从1开始,并由第二个条件-ORDER BY子句排序。您说您想按“开始日期”订购-但查询中没有这样的日期-因此我只是猜测它可能在UserQuizAttemptModels表上-根据需要进行更改和调整。

现在,您可以从具有原始WHERE条件的CTE中进行选择-并指定您只希望每个数据组(对于每个“ QuizId”)的第一行-具有最新“执行记录”的行日期值。

© www.soinside.com 2019 - 2024. All rights reserved.