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

Откуда:
Сообщений: 1196
Всем привет!

Исходные данные:
DECLARE @Table table(Id int PRIMARY KEY, Action char(1))

INSERT INTO @Table
VALUES (1, 'D'), (2, 'D'), (3, 'D'), (4, 'D'),
(5, 'I'), (6, 'I'), (7, 'I'), (8, 'I'),
(9, 'U'), (10, 'U'), (11, 'U'), (12, 'U'),
(13, 'I'), (14, 'I'), (15, 'I'), (16, 'I')

SELECT Id, Action  FROM @Table AS T
ORDER BY Id


Помогите вывести формулу для Package. Значение Package увеличивается на 1 при смене Action.
Id Action Package
1 D 1
2 D 1
3 D 1
4 D 1
5 I 2
6 I 2
7 I 2
8 I 2
9 U 3
10 U 3
11 U 3
12 U 3
13 I 4
14 I 4
15 I 4
16 I 4
12 сен 12, 11:01    [13150288]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Jovanny,
Select Id, Action, dense_rank()over(order by Action,r)
  from ( SELECT T.*, row_number()over(order by ID) -  row_number()over(partition by Action order by ID)r
           FROM @Table AS T)T
12 сен 12, 11:20    [13150448]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Jovanny
Member

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

Спасибо, то, что нужно.
12 сен 12, 11:21    [13150461]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Хотя не совсем. не соблюдается порядок по Id.
Ваш запрос возвращает

Id Action Package
1 D 1
2 D 1
3 D 1
4 D 1
5 I 2
6 I 2
7 I 2
8 I 2
13 I 3
14 I 3
15 I 3
16 I 3
9 U 4
10 U 4
11 U 4
12 U 4

а нужно

Id Action Package
1 D 1
2 D 1
3 D 1
4 D 1
5 I 2
6 I 2
7 I 2
8 I 2
9 U 3
10 U 3
11 U 3
12 U 3
13 I 4
14 I 4
15 I 4
16 I 4
12 сен 12, 11:34    [13150578]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Jovanny
Хотя не совсем. не соблюдается порядок по Id.

Тогда чуть посложнее.
Select Id, Action, dense_rank()over(order by rr)
from
(Select T.*, min(ID)over(partition by Action,r)rr
   from ( SELECT T.*, row_number()over(order by ID) - row_number()over(partition by Action order by ID)r
            FROM @Table AS T)T)T
12 сен 12, 11:51    [13150736]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
aleks2
Guest
Чуть-чуть более понятный вариант
DECLARE @Table table(Id int PRIMARY KEY, Action char(1))

INSERT INTO @Table
VALUES (1, 'D'), (2, 'D'), (3, 'D'), (4, 'D'),
(5, 'I'), (6, 'I'), (7, 'I'), (8, 'I'),
(9, 'U'), (10, 'U'), (11, 'U'), (12, 'U'),
(13, 'I'), (14, 'I'), (15, 'I'), (16, 'I')

;with
nums as (
select T.*, row_number() over(order by T.id) n from @Table T Left outer join @Table T1 on T.Action =T1.Action and T.Id-1=T1.Id where  T1.Id is null
), 
ranges as (
select T.*, isnull(T1.id-1, 1000000) id2 from nums T Left outer join nums T1 on T.n+1  =T1.n
)
select X.*, R.n from @Table X inner join ranges R on X.Id between R.id and R.id2
12 сен 12, 12:00    [13150804]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Спасибо всем!
Мне всё-таки больше нравится вариант qwrqwr.

Я его переписал в таком виде:
WITH T1 AS (SELECT Id, Action, ROW_NUMBER() OVER(ORDER BY Id) - 
				ROW_NUMBER() OVER(PARTITION BY Action ORDER BY Id) AS R FROM @Table),
T2 AS (SELECT Id, Action, MIN(Id) OVER(PARTITION BY Action, R) AS RR FROM T1)
SELECT Id, Action, DENSE_RANK() OVER(ORDER BY RR) AS Package FROM T2
ORDER BY Id
12 сен 12, 12:27    [13150988]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить