Редактировать: другое решение с использованием top
SELECT
*
FROM
Maps2Units MU
CROSS APPLY
(
SELECT TOP (@n) --or TOP 3 etc
*
FROM
Points P
WHERE
P.UnitId = MU.UnitId
) P2
Догадываясь от вашего предыдущего комментария ...
;WITH myCTE AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY P.UnitId ORDER BY P.Timestamp DESC) AS PointsRank
FROM
Points P
JOIN
Maps2Units MU ON P.UnitId = MU.UnitId
)
SELECT
*
FROM
myCTE
WHERE
PointsRank <= @M;
Оригинал:
;WITH myCTE AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY SpeciesID ORDER BY AnimalID /* ? */) AS AnimalRank,
DENSE_RANK() OVER (ORDER BY SpeciesID /* ? */) AS SpeciesRank
FROM
MyAnimals
)
SELECT
*
FROM
myCTE
WHERE
SpeciesRank <= @M
AND
AnimalRank <= @N