Select 来自嵌套 SQL 查询的 TOP 或 GROUP BY 排名数据

Select TOP or GROUP BY ranked data from nested SQL query

我有一个 table 事件和结果以及这样的查询:

   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 一样计数,所以我不能将它用作条件。另外,如果我为前者添加。 EXISTS,语句太大,需要很多时间。

预期结果是 table,只有 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 正确且快速地完成了这项工作。对我帮助很大。

您需要再使用一项 window 功能,即 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

在接下来的查询中,我将 EventPlace 视为 Event_ID。此查询将 return 前 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