如何在SQL中获取最大子集的最大记录

如何在SQL中获取最大子集的最大记录,sql,sql-server,database,Sql,Sql Server,Database,我有以下表格: 训练事件 Id Training Id Due Date 5 1 09/01/2018 6 1 09/15/2018 7 2 09/01/2018 正如你所看到的,这是一片混乱。有没有关于我如何清理这个的想法。用行数对您的行进行排序: SELECT Id, TrainingMaterialOccurrenceId, UserId, TrainingMaterialId, DueDat

我有以下表格:

训练事件

Id Training Id Due Date 5 1 09/01/2018 6 1 09/15/2018 7 2 09/01/2018
正如你所看到的,这是一片混乱。有没有关于我如何清理这个的想法。

行数对您的行进行排序

SELECT Id, TrainingMaterialOccurrenceId, UserId, TrainingMaterialId, DueDate
FROM
(
  SELECT
    tmou.Id,
    tmou.TrainingMaterialOccurrenceId,
    tmou.UserId,
    tmo.TrainingMaterialId,
    tmo.DueDate,
    ROW_NUMBER() OVER(PARTITION BY tmo.TrainingMaterialId
                      ORDER BY tmo.DueDate DESC,
                               tmo.Id DESC,
                               tmou.TrainingMaterialOccurrenceId DESC,
                               tmou.Id DESC) AS rn
  FROM dbo.TrainingMaterialOccurrenceUser as tmou
  INNER JOIN dbo.TrainingMaterialOccurrence as tmo
          ON tmo.Id = tmou.TrainingMaterialOccurrenceId
)
WHERE rn = 1;

我不明白你的预期结果。为什么5-7-chad没有培训ID和截止日期?嘿,对不起,我有个打字错误。我修好了。第二行应该有培训ID和截止日期。请用DBMS标记您的请求。我想是SQL Server吧? Id Occurrence Id User Training Id Due Date 4 6 'Chad' 1 09/15/2018 5 7 'Chad' 2 09/01/2018
SELECT tmou.*, tmo.TrainingMaterialId, tmo.DueDate
FROM dbo.TrainingMaterialOccurrenceUser as tmou
INNER JOIN dbo.TrainingMaterialOccurrence as tmo on
tmou.TrainingMaterialOccurrenceId = tmo.Id
AND tmou.Id IN (SELECT MAX(tmou.Id)
        FROM dbo.TrainingMaterialOccurrenceUser as tmou
        WHERE tmou.UserId = @UserId
        AND tmou.TrainingMaterialOccurrenceId IN (SELECT MAX(tmo.Id) as occurrenceId
                              FROM dbo.TrainingMaterialOccurrence as tmo
                               WHERE tmo.Id IN (Select TrainingMaterialOccurrenceId FROM dbo.TrainingMaterialOccurrenceUser as tmou1 WHERE tmou1.UserId = @UserId)
                            GROUP BY tmo.TrainingMaterialId)
        GROUP BY tmou.TrainingMaterialOccurrenceId)
SELECT Id, TrainingMaterialOccurrenceId, UserId, TrainingMaterialId, DueDate
FROM
(
  SELECT
    tmou.Id,
    tmou.TrainingMaterialOccurrenceId,
    tmou.UserId,
    tmo.TrainingMaterialId,
    tmo.DueDate,
    ROW_NUMBER() OVER(PARTITION BY tmo.TrainingMaterialId
                      ORDER BY tmo.DueDate DESC,
                               tmo.Id DESC,
                               tmou.TrainingMaterialOccurrenceId DESC,
                               tmou.Id DESC) AS rn
  FROM dbo.TrainingMaterialOccurrenceUser as tmou
  INNER JOIN dbo.TrainingMaterialOccurrence as tmo
          ON tmo.Id = tmou.TrainingMaterialOccurrenceId
)
WHERE rn = 1;