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
我有一个 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