[SQL] Нюбские вопросы.
TOP n вроде там
1
2
4
5
6
8
в результате получить 3,7)
Может есть какая-нить базовая таблица == целые числа?
Может есть какая-нить базовая таблица == целые числа?Тебя интересуют ранги, читай от
http://msdn.microsoft.com/en-us/library/ms176102.aspx
http://msdn.microsoft.com/en-us/library/ms186734.aspx
t:([] n: 1 2 3 6 7 10 12)
q)5#t
n
-
1
2
3
6
7
q)exec min n)+til max n)-min n except n from t
4 5 8 9 11
til max n)-min n)
?
если чисел не хватит - можно самому завести
Мб как-нибудь так:
SELECT ROW_NUMBER FROM <таблица, где ищем пропуски> WHERE <поле, в котором ищем пропуски> IS NULL?
поясни пожалуйста, что ты написал.
ROW_NUMBER - хорошо, только вот нумерует строки внутри результата запроса
Что ROW_NUMBER что RANK работают только когда стоят между SELECT и FROM (не знаю, как бы назвать эту "область" запроса т.е. поставить их в WHERE нет возможности.
Чтобы обойти это, я попытался запихать это в таблицу(решить в 2 этапа так сказать но вот беда, из вышестоящего запроса невозможно обратится к столбцу, созданному этими таблицами, даже по имени, которое задаётс AS.
Ну а посмотреть, что возвращает, слабо?Не работает =)
Нашёл вот что:
http://www.sql-tutorial.ru/ru/book_generatsija_chislovoj_pos...
но это же ппц жесть.
а что не работает - прав нет? Ну заведи свою таблицу... Вообще, поищи на sql.ru - там эта тема тыщу раз обсуждалась, собственно, master..spt_values оттуда один раз себе и взял. По поводу ROW_NUMBER и тд ты опять не совсем прав Еще сортировать по ним можно, ну а если действительно фильтровать по этому надо - делай подзапрос и все, проблем опять же никаких. Я правда с трудом представляю, как эти функции задаче поиска пропущенных номеров помогут, ибо номеруют именно результаты запроса, а не что-то там.
а вместо своего примера поищи в BOL, как писать CTE и напиши свой рекурсивный запрос - на порядок читабельнее выглядит (понадобится, например, свою таблицу с числами наполнить)
Что ROW_NUMBER что RANK работают только когда стоят между SELECT и FROMну сделай подзапрос
select NATURAL_NUMBERS.NEXT_NUMBER AS i from (select ROW_NUMBER AS NEXT_NUMBER from big_table) AS NATURAL_NUMBERS where i < 5000
Ну заведи свою таблицу...CREATE запрещено.
select NATURAL_NUMBERS.NEXT_NUMBER AS i from (select ROW_NUMBER AS NEXT_NUMBER from big_table) AS NATURAL_NUMBERS where i < 5000Invalid column name 'i'.
BOLЭто что такое?
попробуй заменить where на having, как вариант
Invalid column name 'i'.
насколько я понимаю,
NATURAL_NUMBERS.NEXT_NUMBER AS i
выполняестя уже после
where i < 5000
поэтому оно и ругается.
если бы можно было что-нибудь вроде big_table.i ....
where i < 5000
то получится просто столбец номеров строк, это можно и проще сделать:
SELECT ROW_NUMBER OVER(ORDER BY <поле> DESC) AS 'RowNumber' FROM <таблица>
Чтобы обойти это, я попытался запихать это в таблицу(решить в 2 этапа так сказать но вот беда, из вышестоящего запроса невозможно обратится к столбцу, созданному этими таблицами, даже по имени, которое задаётс AS.Прямо по ссылке, которую я дал, есть пример:
The following example returns rows with numbers 50 to 60 inclusive in the order of the OrderDate.
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
select 1 as lvl
union all
select lvl+1
from cte
where 1 = 1
and lvl < 1000
)
select lvl from cte
where 1 = 1
and lvl < 1001
option (maxrecursion 1000)
BOL - Books Online - стандартный хелп, очень хороший - рекомендую почаще к нему обращаться, раз пока не очень разбираешься.
По поводу предыдущего примера - фильтруй не по i, а по NATURAL_NUMBERS.NEXT_NUMBER
Действительно клёвый пример, он решает все проблемы разом, спасибо.
А как приджойнить такой запрос к другому?
(пропуски я получил, теперь надо просто прилепить этот результат к другому, уже готовому)
Оставить комментарий
kill-still
Надо отобрать N первых записей из таблицы - чисто потестить.что нашёл:
SQL92::
Informix::
Но ни LIMIT 10, ни FIRST 10 не работает. =(
Microsoft SQL Server 2005 я так понимаю ближе к SQL-92 ведь?