为每个行号选择前 10 个

Posted

技术标签:

【中文标题】为每个行号选择前 10 个【英文标题】:select top 10 for each rownumber 【发布时间】:2015-05-19 17:38:48 【问题描述】:

查询 #1 为每个撬块返回数千行。我想知道是否有更快的方法只为每个滑道选择前 10 名。查询 #2 很慢。有什么方法可以优化查询 #1 以使其更快?

查询 #1

select skid, date_run, price, ROW_NUMBER()over(PARTITION BY 
skid ORDER BY date_run ASC) as rowid 
from stocktrack where rsi is null

查询 #2

with ctevalue
(select skid, date_run, price, ROW_NUMBER()over(PARTITION BY 
skid ORDER BY date_run ASC) as rowid 
from stocktrack where rsi is null
)
select skid, date_run rowid
from ctevalue
where rowid < 11

【问题讨论】:

执行计划是什么样的? stocktrack 表上有哪些索引? 【参考方案1】:

你试过了吗

select 
  * 
from
  (select 
    skid, date_run, price, ROW_NUMBER() over (PARTITION BY skid ORDER BY date_run ASC) as rowid 
  from 
    stocktrack where rsi is null) data
where
  data.rowid < 11

希望对你有帮助

【讨论】:

您能否在启用执行计划的情况下尝试此查询,以查看 SQL Server 是否推荐任何其他索引?我认为它可以通过索引来改进。顺便说一句,您检索了多少条记录?【参考方案2】:

尝试使用cross apply

select st.skid, st.date_run, st.price
from sktable sk cross apply
     (select top 10 st.*
      from stocktrack st2
      where st2.skid = sk.skid and
      order by date_run asc
     ) st

以及stocktrack(skid, date_run, price) 上的索引。

第一个表是skid 所指的任何地方。有需要的可以试试(select distinct skid from stocktrack st)

【讨论】:

以上是关于为每个行号选择前 10 个的主要内容,如果未能解决你的问题,请参考以下文章

模拟 row_number 函数

如何使用行号将多条记录合并为一条?

sqlite 获取行号并为每个组重置

IO流应用:在文本文件前增加行号

linux学习笔记10---命令nl

在 MS Access 上返回行号