如何在SQL中获取最大子集的最大记录
我有以下表格: 训练事件 Id Training Id Due Date 5 1 09/01/2018 6 1 09/15/2018 7 2 09/01/2018如何在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
正如你所看到的,这是一片混乱。有没有关于我如何清理这个的想法。用
行数对您的行进行排序
:
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;