У меня есть таблица с событиями и результатами, и запрос выглядит так:
SELECT T2.EventDate, T2.EventPlace, T2.Par1,
T2.Par2, T2.Result, T2.ResultEventDate_sum
FROM
(SELECT TOP 15 EventDate, EventPlace, Par1, Par2,
Result, SUM(Result) OVER (PARTITION BY EventDate) AS ResultEventDate_SUM
FROM
(SELECT EventDate, EventPlace, Par1, Par2, Result,
ROW_NUMBER() OVER (PARTITION BY EventDate ORDER BY Result DESC) AS EventDate_rank
FROM MainTable
WHERE AND CAST(UserNb AS int) = 103
AND Col1 = 'X' AND Result > 0 AND Col2 LIKE '%Y%'
AND Par1 > 500 AND Par1 <= 700) ranked
WHERE EventDate_rank <= 5 ORDER BY ResultEventDate_sum DESC) T2
Результаты, которые я получаю:
EventDate EventPlace Par1 Par2 Result ResultEventDate_SUM
2019-05-26 PLACE nb 1 508 604 51.20 278.11
2019-05-26 PLACE nb 1 508 571 51.68 278.11
2019-05-26 PLACE nb 1 508 249 56.38 278.11
2019-05-26 PLACE nb 1 508 42 59.40 278.11
2019-05-26 PLACE nb 1 508 39 59.45 278.11
2019-06-09 PLACE nb 3 508 449 50.95 217.05
2019-06-09 PLACE nb 3 508 259 54.79 217.05
2019-06-09 PLACE nb 3 508 254 54.89 217.05
2019-06-09 PLACE nb 3 508 178 56.42 217.05
2019-06-16 PLACE nb 4 508 372 51.49 169.56
2019-06-16 PLACE nb 4 508 66 58.51 169.56
2019-06-16 PLACE nb 4 508 20 59.56 169.56
2019-06-02 PLACE nb 2 508 533 50.19 107.46
2019-06-02 PLACE nb 2 508 149 57.27 107.46
Мне нужно получить список лучших (максимальных) сумм из максимум 5 результатов каждого события, но взять только 3 лучших события. Поэтому я поставил SELECT TOP 15 (3 события по 5 результатов), и результаты запроса в порядке, если по каждому событию есть 5 результатов. Но если для каждого события меньше 5 результатов, я получаю также записи из 4 событий. Как изменить запрос, чтобы убедиться, что будет только 3 события, независимо от того, сколько результатов для каждого? В этом примере вырезаны последние 2 записи (1 событие с наименьшим результатом 107,46). Есть ли способ добиться этого путем упрощения запроса без добавления другого кода?
Я попытался поместить COUNT (*) в первую строку, но он считается таким же, как col resulteventdate, поэтому я не могу использовать его как условие. Также, если я добавил для ex. EXISTS, утверждение слишком большое и занимает много времени.
Ожидаемые результаты - таблица только с 3 событиями с лучшим ResultEventDate_sum:
EventDate EventPlace Par1 Par2 Result ResultEventDate_SUM
2019-05-26 PLACE nb 1 508 604 51.20 278.11
2019-05-26 PLACE nb 1 508 571 51.68 278.11
2019-05-26 PLACE nb 1 508 249 56.38 278.11
2019-05-26 PLACE nb 1 508 42 59.40 278.11
2019-05-26 PLACE nb 1 508 39 59.45 278.11
2019-06-09 PLACE nb 3 508 449 50.95 217.05
2019-06-09 PLACE nb 3 508 259 54.79 217.05
2019-06-09 PLACE nb 3 508 254 54.89 217.05
2019-06-09 PLACE nb 3 508 178 56.42 217.05
2019-06-16 PLACE nb 4 508 372 51.49 169.56
2019-06-16 PLACE nb 4 508 66 58.51 169.56
2019-06-16 PLACE nb 4 508 20 59.56 169.56
Заранее благодарим за любые советы.
ОБНОВЛЕНИЕ после испытаний:
Всем спасибо. Я проверил ваши предложения в запросе, и Dense_Rank сделал работу правильно и довольно быстро. Мне очень помогли.