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

Откуда:
Сообщений: 6
Добрый день!
Подскажите кто нибудь как разбить выборку на группы, до строки подходящий условию и далее новая группа и т.д

Например условие для начала новой группы b=c

Пусть есть такая выборка:
a b с
1 1 2
2 2 3
3 4 4
4 5 5
5 6 8
6 4 4
6 4 4
12 13 11
15 8 13

В итоге должно получится так:
a b с GR
1 1 2 1
2 2 3 1
3 4 4 1
4 5 5 2
5 6 8 2
6 4 4 2
6 4 4 3
12 13 11 3
15 8 13 3

Я уже голову сломал, через ROW_NUMBER, RANK и т.д не могу придумать, так как не знаю что поставить в PARTITION BY, чтобы разбить на группы. Здесь в данных нет определённого поля которое отвечало бы за группы, а только строчка с подходящим условием, которая как раз и отвечает за начало следующей группы.
Использовать можно только стандартный sql без циклов и представлений.
30 сен 15, 17:18    [18216269]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
Владислав Колосов
Member

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

"до строки" означает, что задан порядок сортировки строк, как минимум.
30 сен 15, 18:22    [18216690]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
WarAnt
Member

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

create table #temp (id int identity, b int, c int)


insert #temp select 1,	2
insert #temp select 2,	3
insert #temp select 4,	4
insert #temp select 5,	5
insert #temp select 6,	8
insert #temp select 4,	4
insert #temp select 4,	4
insert #temp select 13,	11

select *, sum(case when b =c then 1 else 0 end) over(order by id) GR
from #temp
30 сен 15, 18:30    [18216734]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
Sivosteev1993
Member

Откуда:
Сообщений: 6
Владислав Колосов,

Сортировка по полю a, я просто получается уже сразу по порядку сделал
30 сен 15, 18:34    [18216751]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
Владислав Колосов
Member

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

идея WarAny состоит в подсчете нарастающего итога по условию смены группы при заданном порядке сортировки.
30 сен 15, 18:43    [18216774]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
Sivosteev1993
Member

Откуда:
Сообщений: 6
WarAnt,
идея интересная, но для 3 строки где 4=4 ставит 1, хотя надо ноль. Щас попробую придумать как обойти этот нюанс.
30 сен 15, 18:45    [18216781]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Sivosteev1993
WarAnt,
идея интересная, но для 3 строки где 4=4 ставит 1, хотя надо ноль. Щас попробую придумать как обойти этот нюанс.


Вы уж определитесь, что все таки является началом новой группы, а то у вас каша в голове,
то
"Например условие для начала новой группы b=c"
то
"где 4=4 ставит 1, хотя надо ноль"
30 сен 15, 19:02    [18216844]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
Sivosteev1993
Member

Откуда:
Сообщений: 6
WarAnt
Sivosteev1993
WarAnt,
идея интересная, но для 3 строки где 4=4 ставит 1, хотя надо ноль. Щас попробую придумать как обойти этот нюанс.


Вы уж определитесь, что все таки является началом новой группы, а то у вас каша в голове,
то
"Например условие для начала новой группы b=c"
то
"где 4=4 ставит 1, хотя надо ноль"



Ну да я не верно написал немного. b=с в двух строках подряд например, так где 4=4 это 0, а где 5=5 это 1. И в итоге в конце если остаётся строка с b=с, то она имеет номер той же группы что и перед ней.

1 1 2 1
2 2 3 1
3 4 4 1
4 5 5 2
5 6 8 2
6 4 4 2
6 4 4 3
12 13 11 3
15 8 13 3
16 20 20 3
30 сен 15, 19:09    [18216872]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
СТУДЕНТ123
Guest
Sivosteev1993,


автор
И в итоге в конце если остаётся строка с b=с, то она имеет номер той же группы что и перед ней.


сортировать то по какому критерию? Вы же понимаете что нету тут первого, второго .... предпоследнего
30 сен 15, 19:18    [18216904]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
Sivosteev1993
Member

Откуда:
Сообщений: 6
СТУДЕНТ123,
Сортировка по столбцу "a". GR это что должно получится.

a b с GR
1 1 2 1
2 2 3 1
3 4 4 1
4 5 5 2
5 6 8 2
6 4 4 2
6 4 4 3
12 13 11 3
15 8 13 3
16 20 20 3
30 сен 15, 19:26    [18216941]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Sivosteev1993
WarAnt
пропущено...


Вы уж определитесь, что все таки является началом новой группы, а то у вас каша в голове,
то
"Например условие для начала новой группы b=c"
то
"где 4=4 ставит 1, хотя надо ноль"



Ну да я не верно написал немного. b=с в двух строках подряд например, так где 4=4 это 0, а где 5=5 это 1. И в итоге в конце если остаётся строка с b=с, то она имеет номер той же группы что и перед ней.

1 1 2 1
2 2 3 1
3 4 4 1
4 5 5 2
5 6 8 2
6 4 4 2
6 4 4 3
12 13 11 3
15 8 13 3
16 20 20 3


ну дак разделите в моем запросе gr на 2 получите то что нужно
30 сен 15, 19:32    [18216951]     Ответить | Цитировать Сообщить модератору
 Re: Разбить выборку на группы  [new]
Sivosteev1993
Member

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

Спасибо большое я разобрался.
1 окт 15, 10:49    [18218829]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить