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

Откуда: Питер
Сообщений: 46
Подскажите, пожалуйста, как решить следующую задачу?

Из выборки:

item1
item1
item2
item2
item2
item2
item1
item3
item3

получить выборку с длиной непрерывных последовательностей:

item1 2
item2 4
item1 1
item3 2
14 мар 19, 14:39    [21832640]     Ответить | Цитировать Сообщить модератору
 Re: Длины непрерывных последовательностей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36459
Никак, потому что нет поля, определяющего порядок последовательности.
14 мар 19, 14:41    [21832646]     Ответить | Цитировать Сообщить модератору
 Re: Длины непрерывных последовательностей  [new]
HornetBlack
Member

Откуда: Питер
Сообщений: 46
Хорошо, а если начальная выборка будет с порядковыми номерами?

1 item1
2 item1
3 item2
4 item2
5 item2
6 item2
7 item1
8 item3
9 item3
14 мар 19, 14:50    [21832654]     Ответить | Цитировать Сообщить модератору
 Re: Длины непрерывных последовательностей  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3965
HornetBlack,
WITH I AS 
(
	SELECT ID, Val FROM 
	(
		SELECT 1 AS ID,'item1' AS Val UNION ALL
		SELECT 2 AS ID,'item1' AS Val UNION ALL
		SELECT 3 AS ID,'item2' AS Val UNION ALL
		SELECT 4 AS ID,'item2' AS Val UNION ALL
		SELECT 5 AS ID,'item2' AS Val UNION ALL
		SELECT 6 AS ID,'item2' AS Val UNION ALL
		SELECT 7 AS ID,'item1' AS Val UNION ALL
		SELECT 8 AS ID,'item3' AS Val UNION ALL
		SELECT 9 AS ID,'item3' AS Val 
	) A
),
I2 AS
(
	SELECT 
		Id,
		Val,
		RN1 = ROW_NUMBER() OVER (PARTITION BY Val Order BY ID),
		RN2 = ROW_NUMBER() OVER (Order BY ID)
	FROM I
)
SELECT Val, COUNT(*) FROM I2
GROUP BY Val, RN2 - RN1
ORDER BY MIN(ID)
14 мар 19, 14:58    [21832669]     Ответить | Цитировать Сообщить модератору
 Re: Длины непрерывных последовательностей  [new]
HornetBlack
Member

Откуда: Питер
Сообщений: 46
a_voronin,

Я изучал похожий пример с последовательностями дат, но там порядковый номер вычитался из даты и это давало параметр для группировки окна, а в моем случае я не мог понять, как получить этот параметр, теперь буду знать )
Большое спасибо за помощь.
14 мар 19, 15:20    [21832709]     Ответить | Цитировать Сообщить модератору
 Re: Длины непрерывных последовательностей  [new]
HornetBlack
Member

Откуда: Питер
Сообщений: 46
a_voronin,

Извините за назойливость, а если чуть более сложная начальная выборка:

1 group1 item1
2 group1 item1
3 group1 item2
4 group1 item2
5 group1 item2
6 group1 item2
1 group2 item2
2 group2 item1
3 group2 item1
4 group2 item1
5 group2 item3
6 group2 item3

и получить:

group1 item1 2
group1 item2 4
group2 item2 1
group2 item1 3
group2 item3 2
15 мар 19, 11:07    [21833423]     Ответить | Цитировать Сообщить модератору
 Re: Длины непрерывных последовательностей  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1430
HornetBlack
a_voronin,

Извините за назойливость, а если чуть более сложная начальная выборка:
ну и суйте в партинш-кляузу аналитического ров-нумбера оба два поля, которые определяют вашу группу уникально...
15 мар 19, 11:17    [21833435]     Ответить | Цитировать Сообщить модератору
 Re: Длины непрерывных последовательностей  [new]
HornetBlack
Member

Откуда: Питер
Сообщений: 46
Щукина Анна,

Спасибо, похоже, я так и сделал ) Тут дело не только в подсчете длины групп, но и в том, чтобы не потерять их порядок. Вроде получилось.
15 мар 19, 11:25    [21833459]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить