Выбор T-Sql * между 30% и 40%

Вопрос

  • Как я пишу Хранимую процедуру T-SQL, которая позволяет мне выбрать проценты строк между X % и % Y?
  • Так в основном я хотел бы выбрать строки между 30 процентами и 40 процентами.....

Я знаю, что можно сделать следующее, но очевидно который не позволяет встреченный, указывают ряд строк между 2 процентами.

SELECT TOP 50 PERCENT * FROM tblAssets 

Справка значительно ценится.

6
задан OMG Ponies 9 July 2010 в 15:43
поделиться

2 ответа

Обновленный ответ

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 проблемы

  1. Производительность - его побили вложенное решение TOP
  2. Точность - Есть неожиданный аспект NTILE, о котором я не знал

Если количество строк в разделе не делится на 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
13
ответ дан 8 December 2019 в 18:32
поделиться

I сам придумал .......

SELECT TOP 40 *  
    INTO #TOP40
    FROM CCDtblAssets

 SELECT * FROM #TOP40
WHERE ASSETID NOT IN   
(SELECT TOP 30 ASSETID FROM #TOP40)

Хотя мне нравится ответ Мартинса.

0
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: