如何在不使用 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
如何在不使用 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
试试这个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
使用 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() 窗口函数吗?
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 )
为任意数量的记录计算并设置 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
使用 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%,您将需要执行另一个子查询来获取所有行的计数,然后进行除法,我'在我进行主要查询之前,我可能会将此作为查询。