如何在不使用Top子句的情况下选择T-SQL中的Top%?

时间:2013-01-16 20:18:55

标签: sql-server tsql

如何在不使用Top子句的情况下从表中选择前40%(或者Top百分比,赋值有点含糊不清)?这个问题适用于T-SQL,SQL Server 2008.我不允许使用Top作为我的作业。

感谢。

这是我尝试过的,但看起来很复杂。是不是有更简单的方法?

select top (convert (int, (select round (0.4*COUNT(*), 0) from MyTable))) * from MyTable

5 个答案:

答案 0 :(得分:5)

尝试NTILE功能:

;WITH YourCTE AS
(
    SELECT 
        (some columns),
        percentile = NTILE(10) OVER(ORDER BY SomeColumn DESC)
    FROM
        dbo.YourTable
)
SELECT *
FROM YourCTE
WHERE percentile <= 4

NTILE(10) OVER(....)会为您的数据创建10组百分比 - 因此,前40%是不在的组。该结果的1,2,3,4

答案 1 :(得分:5)

使用NTILE

CREATE TABLE  #temp(StudentID CHAR(3),  Score  INT)

INSERT #temp  VALUES('S1',75 )
INSERT #temp  VALUES('S2',83)
INSERT #temp  VALUES('S3',91)
INSERT #temp  VALUES('S4',83)
INSERT #temp  VALUES('S5',93 )
INSERT #temp  VALUES('S6',75 )
INSERT #temp  VALUES('S7',83)
INSERT #temp  VALUES('S8',91)
INSERT #temp  VALUES('S9',83)
INSERT #temp  VALUES('S10',93 )

SELECT * FROM (
SELECT NTILE(10) OVER(ORDER BY Score) AS NtileValue,*
FROM #temp) x
WHERE NtileValue <= 4
ORDER BY 1

有趣的是我今天在博客上发表了关于NTILE的文章:Does anyone use the NTILE() windowing function?

答案 2 :(得分:3)

到目前为止给出的NTILE(10)答案的一个问题是,如果表有15行,它们将返回8行(53%)而不是正确的数字,以构成40%(6)。

如果行数不能被桶的数量整除,则额外的行都会进入第一个桶而不是均匀分布。

这个替代方案(借用SQL Menace的表格)避免了这个问题。

WITH CTE
     AS (SELECT *,
                ROW_NUMBER() OVER ( ORDER BY Score) AS RN,
                COUNT(*) OVER()                     AS Cnt
         FROM   #temp)
SELECT StudentID,
       Score
FROM   CTE
WHERE  RN <= CEILING(0.4 * Cnt )

答案 3 :(得分:1)

计算并设置ROWCOUNT以获取任意数量的记录。 然后执行查询有限集。

declare @rc as integer
select @rc = count(*)*0.40 from CTE
Set ROWCOUNT @rc
select * from CTE

ROWCOUNT尚未弃用 - 请参阅http://msdn.microsoft.com/en-us/library/ms188774.aspx

答案 4 :(得分:1)

使用Top t-sql命令:

select top 10 [Column_1],
[Column_2] from [Table]
order by [Column_1]

使用分页方法:

select 
[Column_1],
[Column_2]
from 
    (Select ROW_NUMBER() Over (ORDER BY [Column_1]) AS Row,
    [Column_1],
    [Column_2]
    FROM [Table]) as [alias]
WHERE (Row between 0 and 10)

这是通过[Column_1]查找前10名订单...请注意这是使用[变量]文档方法。

如果你能提供列名和表名,我可以编写更多有用的t-sql,例如为了找到前40%,你需要做另一个子查询来获取所有行的计数然后做除法在进行主查询之前,我可能会将此作为查询。