我有一个查询,我想在其中找到每个时区的前 50 个 event_dates。虽然我明白了,但它目前还没有以可用的方式格式化。我希望结果看起来像:
编号 | 事件日期 | 时区
1 | 2017-08-07 | 山
2 | 2017-08-08 | 山
3 | 2017-08-09 | 山
4 | 2017-08-07 | 中央
5 | 2017-08-08 | 中央
6 | 2017-08-09 | 中央
7 | 2017-08-07 | 东
8 | 2017-08-08 | 东
9 | 2017-08-09 | 东
10 | 2017-08-07 | 西
11 | 2017-08-08 | 西
12 | 2017-08-09 | 西
目前,结果在时区之间混合,如下所示:
编号 | 事件日期 | 时区
1 | 2017-08-07 | 山
2 | 2017-08-07 | 中央
3 | 2017-08-07 | 东
4 | 2017-08-07 | 西
5 | 2017-08-08 | 山
6 | 2017-08-08 | 中央
7 | 2017-08-08 | 东
8 | 2017-08-08 | 西
9 | 2017-08-09 | 山
10 | 2017-08-09 | 中央
11 | 2017-08-09 | 东
12 | 2017-08-09 | 西
我需要做什么来更新查询以这种方式输出?
作为参考,我目前拥有的是这样的:
SELECT TOP 200 ID, event_date, timezone FROM ...
ORDER BY ROW_NUMBER() OVER(PARTITION BY timezone ORDER BY timezone), timezone, event_date ASC
我会先让
ROW_NUMBER
逻辑发生,方法是将其包含在子查询中,然后按每个时区的前 50 行进行过滤。这也使查询不受添加到 FROM 表的新时区的影响。您按行号排序,按时区分区。这导致每个时区的第一个实例是数字 1,每个时区的第二个实例是数字 2,等等。
因此,结果是循环排序的。
查看此查询以了解:
您想要的排序可以在没有聚合的情况下完成:
您可以使用 cte 获取所需的行编号,以将每个时区限制为前 50 个条目,如下所示:
根据源表中的行数,在 timezone 和 event_date 上建立索引并包括 ID 列(假设它不是表的主键)可能是有利的。