Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите, пожалуйста, написать запрос  [new]
linav
Guest
подскажите, пожалуйста, как из такого:
create table #t (id int, hournum int, currdt date, dtfrom datetime, dtend datetime, duration int)
insert into #t
	values	(1, 1, '20140101', null, null, 0),
			(2, 2, '20140101', null, null, 0),
			(3, 3, '20140101', '20140101 3:10', '20140101 3:50', 2400),
			(4, 3, '20140101', '20140101 3:55', '20140101 5:10', 4500),
			(5, 4, '20140101', null, null, 0),
			(6, 5, '20140101', null, null, 0),
			(7, 6, '20140101', '20140101 6:50', '20140101 6:55', 300),
			(8, 7, '20140101', '20140101 7:00', '20140101 8:10', 4200),
			(9, 8, '20140101', null, null, 0)

получить такой результат:
insert into #t
	values	(1, 1, '20140101', null, null, 0),
			(2, 2, '20140101', null, null, 0),
			(3, 3, '20140101', '20140101 3:10', '20140101 3:50', 2400),
			(4, 3, '20140101', '20140101 3:55', '20140101 3:59:59.997', 300),
			(5, 4, '20140101', '20140101 4:00', '20140101 4:59:59.997', 3600),
			(6, 5, '20140101', '20140101 5:00', '20140101 5:10', 600),
			(7, 6, '20140101', '20140101 6:50', '20140101 6:55', 300),
			(8, 7, '20140101', '20140101 7:00', '20140101 7:59:59.997', 3600),
			(9, 8, '20140101', '20140101 8:00', '20140101 8:10', 600)

sql 2008r2
хотелось бы обойтись без курсоров
hournum - номер часа, currdt - дата, dtfrom - начало события, dtend - окончание события, duration - продолжительность в секундах
22 май 14, 13:51    [16054865]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
Glory
Member

Откуда:
Сообщений: 104760
linav
получить такой результат:

А принцип получения этого результата нужно придумать/угадать ?
22 май 14, 13:51    [16054876]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
linav
Guest
Glory,

если события нет, то dtfrom и dtend = null
если duration в строке переходит на другой час (hournum - номер часа, а dtfrom время начала события), то пересчитать duration от dtfrom и до конца часа, остаток перенести на следующий час, соответственно пересчитать для следующего часа dtfrom и dtend
22 май 14, 13:58    [16054954]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
Угадыватель
Guest
Промежутки, большие одного часа или переходящие через границу часа, разрезаются/заполняются границами часовых интервалов.
22 май 14, 13:59    [16054961]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
linav
Guest
если в часу более одного события, то строк часа будет несколько.
но события никогда не пересекаются, максимум конец одного события и начало другого могут совпадать
22 май 14, 14:01    [16054986]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
linav,

Целиком запрос писать лениво, могу дать идею - делаете таблицу часов в сутках (24 записи), джойните с Вашей, для каждого часа проверяете - если он попадает в промежуток и начало и конец промежутка относится к разным часам - то в результрующем запросе выводите новые границы либо (НачалоПромежутка, Час - 1мс), либо (Час, КонецПромежутка), либо (Час-1, Час) в зависимости от очевидных условий.
22 май 14, 14:05    [16055026]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Тынц
22 май 14, 14:07    [16055047]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
linav
Guest
Кот Матроскин
linav,

Целиком запрос писать лениво, могу дать идею - делаете таблицу часов в сутках (24 записи), джойните с Вашей, для каждого часа проверяете - если он попадает в промежуток и начало и конец промежутка относится к разным часам - то в результрующем запросе выводите новые границы либо (НачалоПромежутка, Час - 1мс), либо (Час, КонецПромежутка), либо (Час-1, Час) в зависимости от очевидных условий.

извините, но что-то не очень поняла.
я вроде попыталась через cte, что-то типа, если dtend в следующем часу, то перенести dtend, пересчитать duration, но фигня какая-та вышла, наверное недодумала (((
но вашу идею пока не осилила
22 май 14, 14:12    [16055086]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
linav,

Какой шаг непонятен?
22 май 14, 14:27    [16055220]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
linav
Guest
Кот Матроскин,

может я чего не поняла, но, зачем мне таблица с часами, когда в моей исходной таблице нет пропущенных часов, если не было событий, то всего лишь duration будет 0, а dtfrom и dtend null. единственное, один и тот же час может повторяться несколько раз, если в нем было несколько событий.
я пробовала как-то так: в текущей строке, если dtfrom + duration уходит за пределы этого часа, то здесь пересчитать duration от dtfrom и до конца часа, а остаток перенести на следующую строку, кроме того изменить dtend в текущей строке и dtfrom в следующей. все пробовала через cte, но, видимо, я не до конца понимаю, как это работает, поэтому и получила фигню. вот как-то так.
конечно же можно это легко решить с помощью курсоров, но хотелось бы попробовать обойтись без них
(ничего не получилось и запрос окончательно испортила, поэтому пока не могу его показать)
23 май 14, 07:36    [16059152]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
linav
Guest
up
26 май 14, 09:39    [16071152]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7869
Как это нет пропущенным, в строка 5 и 6 пропущены часы.
26 май 14, 11:05    [16071820]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
linav
Guest
Владислав Колосов
Как это нет пропущенным, в строка 5 и 6 пропущены часы.

там нет событий в эти часы, а часы есть
hournum - номер часа
26 май 14, 11:28    [16072025]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7869
select * 
from #t t1
left join #t t2 on dateadd(hh,t1.hournum,cast(t1.currdt as datetime)) between t2.dtfrom and t2.dtend
	and t2.dtfrom is not null

и применить напильник к запросу.
26 май 14, 12:08    [16072407]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, написать запрос  [new]
linav
Guest
Владислав Колосов
select * 
from #t t1
left join #t t2 on dateadd(hh,t1.hournum,cast(t1.currdt as datetime)) between t2.dtfrom and t2.dtend
	and t2.dtfrom is not null

и применить напильник к запросу.


спасибо большое!
26 май 14, 12:38    [16072647]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить