Goo*_*ber 6 sql t-sql sql-server stored-procedures sql-server-2005
我知道您可以执行以下操作,但显然不会让我们在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个问题
TOP解决方案打败了如果分区中的行数不能被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)
| 归档时间: |
|
| 查看次数: |
1908 次 |
| 最近记录: |