Я знаю, что можно сделать следующее, но очевидно который не позволяет встреченный, указывают ряд строк между 2 процентами.
SELECT TOP 50 PERCENT * FROM tblAssets
Справка значительно ценится.
Обновленный ответ
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
Я обновил свой ответ, так как с моим исходным ответом, приведенным ниже, было 2 проблемы
TOP
Если количество строк в разделе не делится на 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, количество физических чтений 0, лоб упреждающее чтение - 0.
Таблица 'spt_values'. Счетчик сканирований 1, логический чтения 5, физические чтения 0, упреждающее чтение читает 0, lob логически читает 0, lob физические чтения 0, лобовое чтение с упреждающим чтением 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, количество физических чтений 0, лоб упреждающее чтение - 0.
Таблица 'spt_values'. Счетчик сканирований 1, логический читает 8, физические чтения 0, упреждающее чтение читает 0, lob логически читает 0, lob физические чтения 0, лобовое чтение с упреждающим чтением 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
I сам придумал .......
SELECT TOP 40 *
INTO #TOP40
FROM CCDtblAssets
SELECT * FROM #TOP40
WHERE ASSETID NOT IN
(SELECT TOP 30 ASSETID FROM #TOP40)
Хотя мне нравится ответ Мартинса.