Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как сделать такую нумерацию ?  [new]
Диапазанщик
Guest
Такая исходная последовательность
1
2
3
4
2
3
4
1
2
Такой результат
1 1
2 1
3 1
4 1
2 2
3 2
4 2
1 3
2 3
8 апр 16, 14:11    [19032808]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
А почкему у 2йки нумерация началась с 2х, а у 1ниц и 3ек - с 1 ?
8 апр 16, 14:14    [19032832]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Диапазанщик
Guest
2Glory
Пока непрерывный диапазон растет, как только диапазон прервался новый индекс. Естественно есть PK, не указал.
8 апр 16, 14:18    [19032869]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Диапазанщик,


DECLARE @A TABLE(ID INT NOT NULL IDENTITY(1,1), V INT NOT NULL)   


INSERT INTO @A(V) VALUES(1)
INSERT INTO @A(V) VALUES(2)
INSERT INTO @A(V) VALUES(3)
INSERT INTO @A(V) VALUES(4)
INSERT INTO @A(V) VALUES(2)
INSERT INTO @A(V) VALUES(3)
INSERT INTO @A(V) VALUES(4)
INSERT INTO @A(V) VALUES(1)
INSERT INTO @A(V) VALUES(2)


SELECT 
	ID, V, ROW_NUMBER() OVER (PARTITION BY V ORDER BY ID) 
FROM @A
ORDER BY ID


И да вам нужен ID, который задает последовательность
8 апр 16, 14:24    [19032919]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Диапазанщик
Guest
ИД есть. Но не так.


Такая исходная последовательность

1
2
3
4
2
3
4
1
2
Такой результат
1 1
2 1
3 1
4 1
2 2
3 2
4 2
1 3
2 3
8 апр 16, 14:33    [19032998]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20583
Чем задаётся именно такая последовательность записей исходной таблицы?
8 апр 16, 14:39    [19033050]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Диапазанщик
Guest
Есть PK - последовательность такая.

DECLARE @A TABLE(ID INT NOT NULL IDENTITY(1,1), V INT NOT NULL)


INSERT INTO @A(V) VALUES(1)
INSERT INTO @A(V) VALUES(2)
INSERT INTO @A(V) VALUES(3)
INSERT INTO @A(V) VALUES(4)
INSERT INTO @A(V) VALUES(2)
INSERT INTO @A(V) VALUES(3)
INSERT INTO @A(V) VALUES(4)
INSERT INTO @A(V) VALUES(1)
INSERT INTO @A(V) VALUES(2)
8 апр 16, 14:41    [19033067]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
with s as
(
 select
  *,
  row_number() over (order by id) - v as g
 from
  @a 
)
select
 id, v, row_number() over (partition by g order by v)
from
 s;
8 апр 16, 14:50    [19033163]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Диапазанщик
Guest
2invm - Ага оно :).
Спасибо.
8 апр 16, 14:54    [19033201]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Диапазанщик
Guest
Поспешил. Нет не так.

Переформулирую. Пронумеровать возрастающие диапазоны, в идеале диапазоны могут быть с "дырками".
8 апр 16, 14:58    [19033230]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20583
Диапазанщик
диапазоны могут быть с "дырками".
Версия сервера? а то case when value>lead(value)
8 апр 16, 15:25    [19033491]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
with a as
(
 select
  *,
  case when v < lag(v, 1, v + 1) over (order by id) then 1 else 0 end as f
 from
  @a 
),
b as
(
 select
  *,
  sum(f) over (order by id) as g
 from
  a 
)
select
 id, v, row_number() over (partition by g order by v)
from
 b
order by
 id;
8 апр 16, 15:28    [19033540]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
простите , конечно, но задачка в принципе не решаемая по условиям автора


Диапазанщик
Пронумеровать возрастающие диапазоны, в идеале диапазоны могут быть с "дырками"


пример :

id v
1 1
2 2
3 3
4 4
5 5
6 6

надо на выходе чтоб было так

1 1 1
2 2 1
3 3 1
4 4 1
5 5 2
6 6 2

допустим что первая последовательность идёт до 4, а потом уже 2-я со значения 5, тк могут быть дырки аж до 5. и как тут разделить эти последовательности?

как мимнимум должен быть дополнительный признак разделения последолвательности
8 апр 16, 15:33    [19033590]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
Диапазанщик
Guest
Доп условие появления нового номера i+1 элемент < i

Пока ничего лучше курсора не придумал, а может оно и не стоит.
8 апр 16, 15:42    [19033674]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую нумерацию ?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1753
Диапазанщик
Доп условие появления нового номера i+1 элемент < i

Пока ничего лучше курсора не придумал, а может оно и не стоит.


DECLARE @A TABLE(ID INT NOT NULL IDENTITY(1,1), V INT NOT NULL) 

INSERT INTO @A(V) VALUES(1)
INSERT INTO @A(V) VALUES(2)
INSERT INTO @A(V) VALUES(3)
INSERT INTO @A(V) VALUES(4)
INSERT INTO @A(V) VALUES(2)
INSERT INTO @A(V) VALUES(3)
INSERT INTO @A(V) VALUES(4)
INSERT INTO @A(V) VALUES(1)
INSERT INTO @A(V) VALUES(2)

;with CTE as
(
  select
    tmp.ID,
    tmp.V,
    LAG(tmp.V) over(order by tmp.ID) as r
  from
    @A as tmp
),
CTE2 as
(
  select
    c.ID,
    c.V,
    IIF(c.r is null or c.r > c.V, 1, 0) as r
  from
    CTE as c
)
select
  c2.ID,
  c2.V,
  SUM(c2.r) over(order by c2.ID ROWS BETWEEN UNBOUNDED PRECEDING and CURRENT ROW) as r
from
  cte2 as c2


ID	V	r
1 1 1
2 2 1
3 3 1
4 4 1
5 2 2
6 3 2
7 4 2
8 1 3
9 2 3
8 апр 16, 22:00    [19035134]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить