1

如何在不使用 Top 子句的情况下从表中选择 Top 40%(或 Top percent,赋值有点模棱两可)?这个问题是针对 T-SQL、SQL Server 2008 的。我不允许在作业中使用 Top。

谢谢。

这是我尝试过的,但似乎很复杂。没有更简单的方法吗?

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

5 回答 5

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% 是第 40 组。该结果的 1、2、3、4

于 2013-01-16T20:22:00.080 回答
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:有人使用 NTILE() 窗口函数吗?

于 2013-01-16T20:23:06.817 回答
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 )
于 2013-01-16T20:36:36.153 回答
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

于 2013-01-16T20:25:57.960 回答
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 名...请注意,这是使用 [variable] 文档方法。

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

于 2013-01-16T20:29:59.423 回答