我知道您可以执行以下操作,但显然不会让我们在2个百分比之间指定一组行。
SELECT TOP 50 PERCENT * FROM tblAssets
非常感谢。
答案 0 :(得分:13)
更新了答案
declare @NumRecords int
SELECT @NumRecords = COUNT(*) FROM tblAssets;
With Vals As
(
SELECT tblAssets.AssetId ...
, ROW_NUMBER() OVER ( order by tblAssets.AssetId) as RN
FROM tblAssets
)
SELECT tblAssets.AssetId ...
FROM vals
Where RN between 0.3*@NumRecords and 0.4*@NumRecords
我已经更新了我的答案,因为我原来的答案有两个问题
TOP
解决方案如果分区中的行数 是不可被整除的 integer_expression,这会导致 两个大小不同的组 会员。更大的团体来了 指定顺序中的较小组 通过OVER条款。例如,如果 总行数是53和 组数是五,第一组 三组将有11行和 其余两组将有10行 每个
与嵌套的TOP
解决方案相比,我得到了以下值。
SET STATISTICS IO ON
SET STATISTICS TIME ON;
DECLARE @NumRecords int
SELECT @NumRecords = COUNT(*) FROM [master].[dbo].[spt_values];
WITH Vals As
(
SELECT [number]
, ROW_NUMBER() OVER ( order by [number]) as RN
FROM [master].[dbo].[spt_values]
)
SELECT [number] FROM vals Where RN
BETWEEN 0.30*@NumRecords AND 0.40*@NumRecords
给出
表'spt_values'。扫描计数1, 逻辑读取8,物理读取0, 预读读取0,lob逻辑读取 0,lob物理读取0,lob 预读读取0。
表 'spt_values'。扫描计数1,逻辑 读取5,物理读取0,预读 读取0,lob逻辑读取0,lob 物理读取0,lob预读读取 0
SELECT TOP 25 PERCENT [number] FROM
(
SELECT TOP 40 PERCENT [number]
FROM [master].[dbo].[spt_values]
ORDER BY [number] ASC
) TOP40
ORDER BY [number] DESC
给出
表'工作台'。扫描计数1, 逻辑读取4726,物理读取0, 预读读取0,lob逻辑读取 0,lob物理读取0,lob 预读读数为0.
表 'spt_values'。扫描计数1,逻辑 读取8,物理读取0,预读 读取0,lob逻辑读取0,lob 物理读取0,lob预读读取 0
原始答案
With Vals As
(
SELECT tblAssets.AssetId ...
, NTILE (100) OVER ( order by tblAssets.AssetId) as Pct
FROM tblAssets
)
SELECT * FROM vals Where Pct between 30 and 40
答案 1 :(得分:0)
我自己想出了这个.......
SELECT TOP 40 *
INTO #TOP40
FROM CCDtblAssets
SELECT * FROM #TOP40
WHERE ASSETID NOT IN
(SELECT TOP 30 ASSETID FROM #TOP40)
虽然我喜欢马丁斯答案。