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

Откуда:
Сообщений: 9
Здравствуйте.
Если не трудно помогите пожалуйста с запросом. (MS Server 2012)

Есть таблица отсортированная по времени вида:


1 | A | 8:00
2 | A | 8:01
3 | A | 8:03
4 | B | 12:00
5 | B | 12:05
6 | A | 16:00
7 | A | 16:05

Необходимо сгруппировать ее след образом


1 | A | 8:00 <-- Группа 1
2 | A | 8:01 <-- Группа 1
3 | A | 8:03 <-- Группа 1
4 | B | 12:00 <-- Группа 2
5 | B | 12:05 <-- Группа 2
6 | A | 16:00 <-- Группа 3
7 | A | 16:05 <-- Группа 3


Как это возможно?
11 окт 13, 12:49    [14956102]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
qwerty112
Guest
Yenotishe,

dense_rank()over(partition by hour(xz_fld) order by xz_fld)
11 окт 13, 12:54    [14956150]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Добрый Э - Эх
Guest
искать по словам "инвариант группы"
11 окт 13, 12:55    [14956156]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
qwerty112
Guest
нее, так
dense_rank()over(order by hour(xz_fld))
11 окт 13, 12:56    [14956170]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Добрый Э - Эх
Guest
qwerty112,

магия данных. ключевое тут - последовательно идущие записи с одинаковым значением во втором поле, а не с одинаковым "часом" в поле с датой
11 окт 13, 12:56    [14956172]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
qwerty112
Guest
Добрый Э - Эх
qwerty112,

магия данных. ключевое тут - последовательно идущие записи с одинаковым значением во втором поле, а не с одинаковым "часом" в поле с датой

даа, я понимаю :)
просто хотел это услышать от ТС

dense_rank по hour, на его данных - даёт запрошенный результат,
поэтому пусть уточняет ТЗ
11 окт 13, 12:59    [14956193]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
select dense_rank() over ( order by datepart(hh,[Время]) ) as [Группа], *  from [Моя Таблица]
11 окт 13, 12:59    [14956196]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
o-o
Guest
я за вариант qwerty112 ,
только по-моему у него время в varchar-е:

declare @t table (id int, col1 char(1), col2 varchar(10));

insert into @t(id, col1, col2)
values
(1 ,'A' ,'8:00'), 
(2 ,'A' ,'8:01'), 
(3 ,'A' ,'8:03'), 
(4 ,'B' ,'12:00'),
(5 ,'B' ,'12:05'),
(6 ,'A' ,'16:00'),
(7 ,'A' ,'16:05')


select *, 
       dense_rank()over(order by substring (col2, 1, CHARINDEX(':', col2) - 1))
from @t
11 окт 13, 13:02    [14956219]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Yenotishe
Member

Откуда:
Сообщений: 9
Да, я забыла не совсем правильно описала пример, часы в одной группе могут быть разные, необходимо сгруппировать именно по средней колонке.
11 окт 13, 13:07    [14956262]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
o-o
Guest
приз на лучший хрустальный шар уходит Доброму Э - Эх -у!
11 окт 13, 13:14    [14956322]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Вот такая матрёшка получилась:
with tab as
(
  select *
  from (values(1, 'A', '8:00'),
              (2, 'A', '8:01'),
              (3, 'A', '8:03'),
              (4, 'B', '12:00'),
              (5, 'B', '12:05'),
              (6, 'A', '16:00'),
              (7, 'A', '16:05')) t (id, name, time)
)
select id, name, time, dense_rank() over(order by max_id) as group_number
from
(
  select id, name, time, max(id) over(partition by rn) as max_id
  from
  (
    select id, name, time, row_number() over(order by id) - row_number() over(partition by name order by id) as rn
    from tab
  ) t
) x
order by id;

Не оставляет мысль, что можно обойтись двумя уровнями вложенности вместо трёх.
11 окт 13, 13:22    [14956402]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
можно в лоб...рекурсией :)

declare @t table ( id int, a char, t time)
insert into @t 
values (1, 'A', '8:00')
, (2, 'A', '8:01')
, (3, 'A ', '8:03')
, (4, 'B', '12:00')
, (5, 'B', '12:05')
, (6, 'A', '16:00')
, (7, 'A', '16:05');

with cte
as
(
select top 1 *, 1 as [gr] from @t
order by id
union all
select t1.*, case when t1.a = t2.a then t2.gr else t2.gr+1 end 
from @t t1 inner join cte t2
on t1.id = t2.id + 1
)
select * from cte
11 окт 13, 13:29    [14956449]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Добрый Э - Эх
Guest
Гость333
Не оставляет мысль, что можно обойтись двумя уровнями вложенности вместо трёх.

Для этого нужно забыть про метод, основанный на инварианте группы, но вспомнить, про start_of_group-способ на основе lead/lag:

with tab as
(
  select *
  from (values(1, 'A', '8:00'),
              (2, 'A', '8:01'),
              (3, 'A', '8:03'),
              (4, 'B', '12:00'),
              (5, 'B', '12:05'),
              (6, 'A', '16:00'),
              (7, 'A', '16:05')) t (id, name, time)
)
--
--
select id, name, time, sum(start_of_group) over(order by id) as grp_num
  from (
         select id, name, time, 
                case 
                   when name = lag(name) over(order by id) 
                     then 0 
                   else 1 
                end as start_of_group
           from tab
       ) v
 order by id
on-line проверка на sqlfiddle.com
11 окт 13, 13:41    [14956524]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
with tab as
(
  select *
  from (values(1, 'A', '8:00'),
              (2, 'A', '8:01'),
              (3, 'A', '8:03'),
              (4, 'B', '12:00'),
              (5, 'B', '12:05'),
              (6, 'A', '16:00'),
              (7, 'A', '16:05')) t (id, name, time)
)

select
	DENSE_RANK() over ( order by datepart(hh,time),name)  [группа]
        ,*

from tab	
11 окт 13, 13:47    [14956549]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Добрый Э - Эх,

Красиво, спасибо. Я вертел LAG так и сяк, а накопительный итог не догадался применить.
11 окт 13, 13:51    [14956571]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Yenotishe
Member

Откуда:
Сообщений: 9
Спасибо всем за помощь!

Добрый Э - Эх, отдельное спасибо.
Я тоже пыталась с помощью lag это осуществить, но сообразительности не хватило)
11 окт 13, 13:55    [14956597]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить