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

Откуда: СПб
Сообщений: 937
есть некотороая табличка

declare @t table(id int identity, p nvarchar(5) , num nvarchar(5), t1 datetime2, t2 datetime2, ord int)
insert into @t
select 'type1', 'num 1', '12.11.2013 07:00', '12.11.2013 08:00' , 1
union all select 'type1', 'num 2', '12.11.2013 08:05', '12.11.2013 09:00' , 2
union all select 'type2', 'num 3', '12.11.2013 09:00', '12.11.2013 10:00' , 3
union all select 'type2', 'num 4', '12.11.2013 10:00', '12.11.2013 11:00' , 4
union all select 'type1', 'num 5', '12.11.2013 11:05', '12.11.2013 12:00' , 5


id Тип номер начало конец порядок
1 type1 num 1 2013-11-12 07:00 2013-11-12 08:00 1
2 type1 num 2 2013-11-12 08:05 2013-11-12 09:00 2
3 type2 num 3 2013-11-12 09:00 2013-11-12 10:00 3
4 type2 num 4 2013-11-12 10:00 2013-11-12 11:00 4
5 type1 num 5 2013-11-12 11:05 2013-11-12 12:00 5

нужно получить такое вот
Тип начало конец id начала id конца
type1 2013-11-12 07:00 2013-11-12 09:00 1 2
type2 2013-11-12 09:00 2013-11-12 11:00 3 4
type1 2013-11-12 11:05 2013-11-12 12:00 5 5


то есть сгруппировать по типу но с учетом следования друг за другом. начало текущей и конец предыдущей могут не совпадать.
Количество строк одного типа которые нужно сгруппировать - 1...20.

Это легко получается с курсором, но хочется без него и щтоб быстро )
Вопрос к уважаемым гуру, задача решаема операциями с множествами в SQL? )
21 ноя 13, 11:39    [15167032]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Кифирчик,

а пять минут в 8 часов можно простить что ли?
21 ноя 13, 12:00    [15167188]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
Glory
Member

Откуда:
Сообщений: 104751
По-моему, это просто переходы поля Тип. С выбором первой и последнй записи в окне Тип + начало
21 ноя 13, 12:07    [15167261]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
with x as
(
 select
  *,
  row_number() over (order by ord) - row_number() over (partition by p order by ord) as g
from
 @t
)
select
 p, min(t1), max(t2), min(ord), max(ord) 
from
 x
group by
 p, g
order by
 min(t1);
21 ноя 13, 12:10    [15167282]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
Кифирчик
Member

Откуда: СПб
Сообщений: 937
iap
Кифирчик,
а пять минут в 8 часов можно простить что ли?

один из вариантов решить подобную проблему- это джойнить предыдущую запись по порядковому номеру либо дате
но к сожалению даты могут отличаться, по ним джойнить не получится, да и сколько записей нужно сгруппировать - не понятно, делать по 20 join на всякий случай как-то не по феншую.
такой подход здесь не подходит, по этому я внес погрешность с датой.

Glory
По-моему, это просто переходы поля Тип. С выбором первой и последней записи в окне Тип + начало

эм... не совсем Вас понял, подробнее пожалуйста.

Это учет различных "операций", и когда друг за другом следуют одинаковые операции - для отчета нужны данные (время) начала и конца.
21 ноя 13, 12:16    [15167338]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
Кифирчик
Member

Откуда: СПб
Сообщений: 937
invm,
супер! спасибо, Вы волшебник)
21 ноя 13, 12:18    [15167356]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
Glory
Member

Откуда:
Сообщений: 104751
Кифирчик
Glory
По-моему, это просто переходы поля Тип. С выбором первой и последней записи в окне Тип + начало

эм... не совсем Вас понял, подробнее пожалуйста.

Это учет различных "операций", и когда друг за другом следуют одинаковые операции - для отчета нужны данные (время) начала и конца.

В вашем примере 3 "окна". Окно меняется, когда меняется значение в поле Тип
Внутри окна записи упорядочены по Начало
21 ноя 13, 12:19    [15167371]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Кифирчик
invm,
супер! спасибо, Вы волшебник)
Никакого волшебства. Подобные задачи появляются на форуме с завидной регулярностью, так что решение пора уже в FAQ выносить.
Вам просто нужно было поискать по форуму.
21 ноя 13, 12:28    [15167449]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
Кифирчик
Member

Откуда: СПб
Сообщений: 937
invm
решение пора уже в FAQ выносить

+1024
поиском... эм...

2Glory,
угу, и эти окна выделяются через "over (partition by", с каждым днем узнаю для себя много нового )
21 ноя 13, 13:12    [15167736]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Кифирчик
iap
Кифирчик,
а пять минут в 8 часов можно простить что ли?

один из вариантов решить подобную проблему- это джойнить предыдущую запись по порядковому номеру либо дате
но к сожалению даты могут отличаться, по ним джойнить не получится, да и сколько записей нужно сгруппировать - не понятно, делать по 20 join на всякий случай как-то не по феншую.
такой подход здесь не подходит, по этому я внес погрешность с датой.
Я только обратил внимание, что один период заканчивается в 8:00,
а следующий начинается в 8:05, однако, Вы их объединили в один - с 7 до 9.
Мне показалось, что это странно.
21 ноя 13, 13:20    [15167797]     Ответить | Цитировать Сообщить модератору
 Re: подскажите с группировкй  [new]
Кифирчик
Member

Откуда: СПб
Сообщений: 937
iap
.... Вы их объединили в один - с 7 до 9.
Мне показалось, что это странно.

логично )))
Вообще, временных разрывов быть не должно, но на практике дата может чуток отличаться. В отчетах интересен весь интервал, в не зависимости от подобных расхождений.
21 ноя 13, 13:34    [15167905]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить