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

时间:2010-07-09 15:30:19

标签: sql sql-server sql-server-2005 tsql stored-procedures

问题

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

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

SELECT TOP 50 PERCENT * FROM tblAssets 

非常感谢。

2 个答案:

答案 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

我已经更新了我的答案,因为我原来的答案有两个问题

  1. 效果 - 它被嵌套的TOP解决方案
  2. 击败
  3. 准确性 - 我不知道
  4. 有一个意想不到的NTILE方面
      

    如果分区中的行数   是不可被整除的   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)

虽然我喜欢马丁斯答案。