Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать запрос  [new]
ArikKh
Member

Откуда:
Сообщений: 36
Есть табличка с поями [id](int), [min_val](int).
id | min_val
-----------
1 | 10
2 | 50
3 | 25

Нужно сделать выборку с полями [id](int), [min_val](int), [max_val](int).
так что:

id | min_val | max_val
---------------------
1 | 10 | 24
3 | 25 | 49
2 | 50 | 999999

то есть max_val = следующий больший min_val -1
15 фев 12, 23:16    [12099768]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
ArikKh,

если нумерация без пропусков, то JOIN саму на себя, если возможны пропуски, то ROW_NUMBER + JOIN саму на себя
15 фев 12, 23:24    [12099799]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
BEGIN TRAN

CREATE TABLE #t(ID INT IDENTITY(1,1),f2 int)
INSERT INTO #t(f2)VALUES (10),(50),(25),(1000000)

SELECT ID, f2 as Min_Val, (SELECT MIN(f2)-1 FROM #t WHERE f2 > m.f2) as Max_Val
FROM #t m
order by f2

ROLLBACK
15 фев 12, 23:28    [12099817]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ArikKh
Member

Откуда:
Сообщений: 36
iljy,
Возможны пропуски...
А как "заджоинить" каждую строчку только с одно, той у которой min_val наименьший из всех min_val-ов больших текущего min_val?
15 фев 12, 23:31    [12099832]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ArikKh
Member

Откуда:
Сообщений: 36
SandalTree,
Спасибо)
15 фев 12, 23:35    [12099846]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
ArikKh,

DECLARE @t table (id int, min_val int)
INSERT @t values (1, 10),(2, 50),(3, 25)

;with cte as
(
	select *, ROW_NUMBER() over(order by min_val) rn from @t
)
select t1.id, t1.min_val, ISNULL(t2.min_val, 1000000) -1 max_val
from cte t1 left join cte t2 on t2.rn = t1.rn+1
16 фев 12, 00:07    [12099956]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
ArikKh
Member

Откуда:
Сообщений: 36
iljy,

Спасибо)
16 фев 12, 00:51    [12100064]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить