SQL Server: как выбрать фиксированное количество строк (выбрать каждое x-е значение)

Краткое описание: у меня есть таблица с данными, которые обновляются за определенный период времени. Теперь проблема в том, что - в зависимости от природы датчика, который отправляет данные, - в этот период времени может быть либо 50 наборов данных, либо 50 000. Поскольку я хочу визуализировать эти данные (используя ASP.NET / c #), для первого предварительного просмотра я хотел бы выбрать только 1000 значений из таблицы.

У меня уже есть подход, заключающийся в следующем: я подсчитываю строки в интересующий период времени с простым предложением «где», чтобы указать идентификатор датчика, сохраняю его как переменную в SQL, а затем делю count () на 1000 Я пробовал это в MS Access, где он работает просто отлично:

set @divider = select count(*) from table where [...]

SELECT (Int([RowNumber]/@divider)), First(Value)
FROM myTable
GROUP BY (Int([RowNumber]/@divider));

Хитрость в Access заключалась в том, что у меня просто есть поле данных («RowNumber»), которое является моим PK / ID, и идет от 0 до. Я попытался сделать это в SQL Server, используяROW_NUMBER() метод, который работает более или менее. У меня есть правильный синтаксис для метода, но я не могу использоватьGROUP BY заявление

Оконные функции могут появляться только в предложениях SELECT или ORDER BY.

смыслROW_NUMBER() не может быть вGROUP BY заявление.

Теперь я застрял. Я пытался спастиROW_NUMBER значение в символ или отдельный столбец, иGROUP BY это позже, но я не мог сделать это. И почему-то я начинаю думать, что моя стратегия может иметь свои слабые стороны ...? : /

Чтобы уточнить еще раз: мне не нужноSELECT TOP 1000 из моей таблицы, потому что это будет означать, что я выберу первые 1000 значений (в зависимости от сортировки). Мне необходимоSELECT каждое х-е значение, в то время как я могу вычислить х (и я мог бы даже округлить его до INT, если это поможет сделать это). Надеюсь, я смог описать проблему понятно ...

Это мой первый пост в StackOverflow, надеюсь, я не забыл ничего важного или важного, если вам нужна дополнительная информация (структура таблицы, мои запросы ...), пожалуйста, не стесняйтесь спрашивать. Любая помощь или подсказка высоко ценится - заранее спасибо! :)

Обновление: РЕШЕНИЕ! Большое спасибоhttps://stackoverflow.com/users/52598/lieven!!!

Вот как я это сделал в итоге:

Я объявляю 2 переменные - я считаю свои строки и устанавливаю их в первую переменную. Затем я использую ROUND () для только что назначенной переменной и делю ее на 1000 (потому что в конце я хочу около 1000 значений!). Я разделил эту операцию на 2 переменные, потому что, если я использовал значение из функции COUNT в качестве основы для моей операции ROUND, возникли некоторые ошибки.

declare @myvar decimal(10,2) 
declare @myvar2 decimal(10,2)

set @myvar = (select COUNT(*)
from value_table
where channelid=135 and myDate >= '2011-01-14 22:00:00.000' and myDate <= '2011-02-14 22:00:00.000'
)

set @ myvar2 = ROUND (@ myvar / 1000, 0)

Теперь у меня есть округленное значение, которое я хочу использовать в качестве размера шага (примите каждое x-е значение -> это наш «x»;)), хранящееся в @ myvar2. Затем я выберу данные нужного временного промежутка и канала и добавлю ROW_NUMBER () в качестве столбца «rn», и, наконец, добавлю предложение WHERE во внешний SELECT, где я делю ROW_NUMBER на @ myvar2 - когда модуль равен 0, строка будет выбрана.

select * from
(
select (ROW_NUMBER() over (order by id desc)) as rn, myValue, myDate
from value_table
where channel_id=135 and myDate >= '2011-01-14 22:00:00.000' and myDate<= '2011-02-14 22:00:00.000'
) d
WHERE rn % @myvar2 = 0

Работает как шарм - еще раз все мое спасибоhttps://stackoverflow.com/users/52598/lievenсм. комментарий ниже для оригинальной публикации!

Ответы на вопрос(2)

Ваш ответ на вопрос