T-Sql选择*30%到40%之间

Goo*_*ber 6 sql t-sql sql-server stored-procedures sql-server-2005

  • 如何编写T-SQL存储过程,让我选择X%和Y%之间的行百分比?
  • 所以基本上我想要选择30 PERCENT和40 PERCENT之间的行.....

我知道您可以执行以下操作,但显然不会让我们在2个百分比之间指定一组行.

SELECT TOP 50 PERCENT * FROM tblAssets 
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Mar*_*ith 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
Run Code Online (Sandbox Code Playgroud)

我已经更新了我的答案,因为下面我的原始答案有2个问题

  1. 性能 - 它被嵌套TOP解决方案打败了
  2. 准确性 - 我不知道有一个意想不到的NTILE方面

如果分区中的行数不能被integer_expression整除,则会导致两个大小的组相差一个成员.较大的组按OVER子句指定的顺序位于较小的组之前.例如,如果总行数为53且组数为5,则前三个组将具有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
Run Code Online (Sandbox Code Playgroud)

表'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
Run Code Online (Sandbox Code Playgroud)

表'工作台'.扫描计数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
Run Code Online (Sandbox Code Playgroud)