Выберите данные TOP или GROUP BY из вложенного запроса SQL - PullRequest
0 голосов
/ 19 июня 2019

У меня есть таблица с событиями и результатами, и запрос выглядит так:

   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 сделал работу правильно и довольно быстро. Мне очень помогли.

Ответы [ 2 ]

1 голос
/ 19 июня 2019

В этом следующем запросе я рассмотрел EventPlace как Event_ID.Этот запрос вернет подробности ТОП-3 события (на основе суммы результатов на событие) (ТОП-5 строк для каждого события)

SELECT * FROM
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY EventPlace ORDER BY EventPlace,Result DESC)  RN
    FROM your_table
    WHERE EventPlace IN
    (
        -- You can set any number based on 
        -- How many event details you wants to see
        SELECT TOP 3 EventPlace
        FROM 
        (
            SELECT *, ROW_NUMBER() OVER(PARTITION BY EventPlace ORDER BY EventPlace,Result DESC)  RN
            FROM your_table
        )A
        -- You can set any number based on 
        -- How many row's result you want to SUM for checking
        WHERE RN <= 5
        GROUP BY EventPlace
        ORDER BY SUM(Result) DESC
    )
)B
WHERE RN <= 5
1 голос
/ 19 июня 2019

Вам нужно использовать еще одну оконную функцию, т.е. Dense_Rank.Это может помочь вам получить требуемый результат.

select EventDate,EventPlace,Par1,Par2,Result,ResultEventDate_sum from(
SELECT T2.EventDate, T2.EventPlace, T2.Par1,
T2.Par2, T2.Result, T2.ResultEventDate_sum ,
DENSE_RANK()over(order by ResultEventDate_sum,T2.EventDate desc)rnk
FROM
(SELECT  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  ) T2
 )T1 
 WHERE RNK<=3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...