如何在没有任何渐进字段的情况下对表进行分区?

问题描述

我需要对表进行分区以获取值范围内的记录。

表格中没有累进字段。

select [_Load_Timestamp],[COL_A],[COL_B],[COL_C],[COL_D],[COL_E],[COL_F]
from dbo.table
where ROW_NUMBER() OVER (order by [_Load_Timestamp],[COL_C]) between 500 and 1000;

编写此代码,它返回以下错误

Windowed functions can only appear in the SELECT or ORDER BY clauses.

问题在于 ROW_NUMBER() 语句。

我可以像这样编写查询,但问题是我必须尽可能地限制对表的访问,因为它真的很慢。

select *
from ( 
        select ROW_NUMBER() OVER (order by [_Load_Timestamp],[COL_C])) [id],[_Load_Timestamp],[COL_F]
        from dbo.table
     ) t
where t.id between 500 and 1000;

谁能给我一个替代方案来达到同样的目标?

解决方法

试试这个:

;with MyTable as  
    ( 
        select 
                ROW_NUMBER() OVER (order by [_Load_Timestamp],[COL_A],[COL_B],[COL_C])) [id],[_Load_Timestamp],[COL_C],[COL_D],[COL_E],[COL_F]
        from dbo.table
     )
select  *
from MyTable
where id between 500 and 1000
;
,

我找到了解决方案。

select  ROW_NUMBER() OVER (order by [_Load_Timestamp],[COL_C]
into #tmp_key
from dbo.table

create index IX_01 on #tmp_key on ([id])

select _b.*
from #tmp_key _a
join dbo.table _b on _a.id between 500 and 1000
and _a.[_Load_Timestamp] = _b.[_Load_Timestamp] 
and _a.[COL_A] = _b.[COL_A]
and _a...

数字 500 和 1000 将根据为我填充表格的循环动态设置。

无论如何,我解决了我的问题。