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

Откуда: Москва
Сообщений: 191
MS SQL2005

Здравствуйте, подскажите пожалуйста
есть запрос формирующий программу мероприятия например такой
Select beginDate, endDate, FIO, Theme from...

результат такой например
2015-01-28 10:00:00.000	2015-01-28 10:15:00.000	Григорьева Елена Андреевна	Русская Промышленная Компания - 25 лет на рынке САПР и ГИС
2015-01-28 10:15:00.000 2015-01-28 10:45:00.000 Ечина Екатерина Николаевна Что необходимо знать, приобретая САПР
2015-01-28 10:45:00.000 2015-01-28 12:00:00.000 Панин Сергей Сергеевич Инженер Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor
2015-01-28 12:20:00.000 2015-01-28 13:40:00.000 Панин Сергей Сергеевич Инженер Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor
2015-01-28 14:00:00.000 2015-01-28 14:40:00.000 Муравьев Василий Владимирович Autodesk Vault 2015. Универсальное решение для создания, администрирования электронного архива

вопрос
- можно ли в данный запрос вставить что-то)) на предмет анализа времени между строками
например если между первой и второй строкой прошло
<30 минут - Это ответы на вопросы
>=30 минут - Это Обеденный перерыв
и т.д.

получив в результата например вот такое
2015-01-28 10:00:00.000	2015-01-28 10:15:00.000	Григорьева Елена Андреевна	Русская Промышленная Компания - 25 лет на рынке САПР и ГИС
2015-01-28 10:15:00.000 2015-01-28 10:45:00.000 Ечина Екатерина Николаевна Что необходимо знать, приобретая САПР
2015-01-28 10:45:00.000 2015-01-28 12:00:00.000 Панин Сергей Сергеевич Инженер Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor
2015-01-28 12:00:00.000 2015-01-28 12:20:00.000 Ответы на вопросы
2015-01-28 12:20:00.000 2015-01-28 13:40:00.000 Панин Сергей Сергеевич Инженер Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor
2015-01-28 13:40:00.000 2015-01-28 14:00:00.000 Ответы на вопросы
2015-01-28 14:00:00.000 2015-01-28 14:40:00.000 Муравьев Василий Владимирович Autodesk Vault 2015. Универсальное решение для создания, администрирования электронного архива

Сейчас решаем это дело в скриптах ADO
а можно ли в одном запросе?
2 фев 15, 11:53    [17205464]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
ef1,

union all?
2 фев 15, 12:15    [17205692]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
а как? не про объединение...
про формирование второго Select'a
в голову ничего не приходит, как в нем сравнить строки проанализировать дельту?
2 фев 15, 12:24    [17205759]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
ef1
а как? не про объединение...
про формирование второго Select'a
в голову ничего не приходит, как в нем сравнить строки проанализировать дельту?

ну так дельта между чем-то и чем-то, пишите джойн таблицы саму на себя (текущую запись к предыдущей) и ищите дельту
2 фев 15, 12:34    [17205841]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
Glory
Member

Откуда:
Сообщений: 104751
ef1
про формирование второго Select'a
в голову ничего не приходит, как в нем сравнить строки проанализировать дельту?

Для каждой записи ищите предыдущие записи с меньшими временами и берете из них одну с наибольшим временем
2 фев 15, 12:37    [17205867]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
vova ivanov
Member [заблокирован]

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

так вроде

declare @t table (beginDate datetime, endDate datetime, FIO varchar(100), Theme varchar(200))


insert into @t
select '2015-01-28 10:00:00.000',	'2015-01-28 10:15:00.000',	'Григорьева Елена Андреевна',	'Русская Промышленная Компания - 25 лет на рынке САПР и ГИС' union all
select '2015-01-28 10:15:00.000',	'2015-01-28 10:45:00.000',	'Ечина Екатерина Николаевна',	'Что необходимо знать, приобретая САПР' union all
select '2015-01-28 10:45:00.000',	'2015-01-28 12:00:00.000',	'Панин Сергей Сергеевич	Инженер',	'Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor' union all
select '2015-01-28 12:20:00.000',	'2015-01-28 13:40:00.000',	'Панин Сергей Сергеевич	Инженер',	'Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor' union all
select '2015-01-28 14:00:00.000',	'2015-01-28 14:40:00.000',	'Муравьев Василий Владимирович',	'Autodesk Vault 2015. Универсальное решение для создания, администрирования электронного архива'

-- select * from @t

select d.* 
from @t a
outer apply (select top 1 b.beginDate from @t b where b.beginDate>=a.endDate order by b.beginDate) c
cross apply (select a.beginDate, a.endDate, a.FIO, a.Theme
			union all
			select a.endDate, c.beginDate, null, 'Ответы на вопросы'
			where a.endDate<>c.beginDate and datediff(n,a.endDate,c.beginDate)<30 
			union all
			select a.endDate, c.beginDate, null, 'Обеденный перерыв'
			where a.endDate<>c.beginDate and datediff(n,a.endDate,c.beginDate)>=30) d

beginDate               endDate                 FIO                                                                                                  Theme
----------------------- ----------------------- ---------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2015-01-28 10:00:00.000 2015-01-28 10:15:00.000 Григорьева Елена Андреевна Русская Промышленная Компания - 25 лет на рынке САПР и ГИС
2015-01-28 10:15:00.000 2015-01-28 10:45:00.000 Ечина Екатерина Николаевна Что необходимо знать, приобретая САПР
2015-01-28 10:45:00.000 2015-01-28 12:00:00.000 Панин Сергей Сергеевич Инженер Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor
2015-01-28 12:00:00.000 2015-01-28 12:20:00.000 NULL Ответы на вопросы
2015-01-28 12:20:00.000 2015-01-28 13:40:00.000 Панин Сергей Сергеевич Инженер Прототипирование с использованием правил на предприятии: возможности инструмента iLogic в Autodesk Inventor
2015-01-28 13:40:00.000 2015-01-28 14:00:00.000 NULL Ответы на вопросы
2015-01-28 14:00:00.000 2015-01-28 14:40:00.000 Муравьев Василий Владимирович Autodesk Vault 2015. Универсальное решение для создания, администрирования электронного архива

(7 row(s) affected)
2 фев 15, 12:44    [17205925]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
ВОТ!!! ВОТ за это СПАСИБО!!!
а то сижу туплю)))
...
все - ушел в работу ))

ps
спасибо всем!
2 фев 15, 13:00    [17206048]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
>vova ivanov

можно еще вопрос? пока горячее ))
(пример под себя переделал все ок)

а как сюда же (в этот код) добавить первой строкой (минус полчаса)
select ....beginDate, dateadd(n,-30, .....beginDate), null, 'Регистрация на мероприятие'

и последней строкой (плюс полчаса)
select ....endDate, dateadd(n,30, .....endDate), null, 'Ответы на вопросы и фуршет))'
2 фев 15, 15:03    [17207041]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Написать еще 2 union all
2 фев 15, 15:06    [17207057]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
)) я понимаю что наглею ))
не получается ))
2 фев 15, 15:09    [17207068]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
Glory
Member

Откуда:
Сообщений: 104751
ef1
не получается ))

Напишите сначала эти два запроса без union all
2 фев 15, 15:12    [17207084]     Ответить | Цитировать Сообщить модератору
 Re: Как сформировать 'программу мероприятия' в одном SQL запросе вставляя перерывы  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
вот такой зверь получился)) главное все ок, всем спасибо!

select dateadd(n,-30, min(vv2.value)), min(vv2.value), '-', 'Регистрация на мероприятие'
  from LSDBO.Ric_Get_objChild(100000563400035,'Стки,Стк') as rw left join
       lsdbo.attrib_value_view av2 on rw.id=av2.object_id and av2.attrib_id=3000000000082 left join 
       lsdbo.value_datetime_view vv2 on av2.value_id=vv2.id and av2.attrib_id=3000000000082

union all

Select d.*
  from 
     (select  vv2.value as beginDate, vv3.value as endDate, rw.description as FIO, vv0.value as Status, vv.value as Company, vv1.value as Theme 
        from LSDBO.Ric_Get_objChild(100000563400035,'Стки,Стк') rw left join
             lsdbo.attrib_value_view av on rw.id=av.object_id and av.attrib_id=100004068400000 left join 
			 lsdbo.value_string_view vv on av.value_id=vv.id and av.attrib_id=100004068400000 left join 
	         lsdbo.attrib_value_view av0 on rw.id=av0.object_id and av0.attrib_id=3000000000086 left join 
             lsdbo.value_string_view vv0 on av0.value_id=vv0.id and av0.attrib_id=3000000000086 left join 
	         lsdbo.attrib_value_view av1 on rw.id=av1.object_id and av1.attrib_id=100004091100000 left join 
	         lsdbo.value_string_view vv1 on av1.value_id=vv1.id and av1.attrib_id=100004091100000 left join 
	         lsdbo.attrib_value_view av2 on rw.id=av2.object_id and av2.attrib_id=3000000000082 left join 
	         lsdbo.value_datetime_view vv2 on av2.value_id=vv2.id and av2.attrib_id=3000000000082 left join 
             lsdbo.attrib_value_view av3 on rw.id=av3.object_id and av3.attrib_id=3000000000083 left join 
	         lsdbo.value_datetime_view vv3 on av3.value_id=vv3.id and av3.attrib_id=3000000000083)  as a
 outer apply 
     (select top 1 b.beginDate 
	    from (select  vv2.value as beginDate, vv3.value as endDate 
                from LSDBO.Ric_Get_objChild(100000563400035,'Стки,Стк') rw left join
	                 lsdbo.attrib_value_view av2 on rw.id=av2.object_id and av2.attrib_id=3000000000082 left join 
	                 lsdbo.value_datetime_view vv2 on av2.value_id=vv2.id and av2.attrib_id=3000000000082 left join 
                     lsdbo.attrib_value_view av3 on rw.id=av3.object_id and av3.attrib_id=3000000000083 left join 
	                 lsdbo.value_datetime_view vv3 on av3.value_id=vv3.id and av3.attrib_id=3000000000083) b 
  	   where b.beginDate>=a.endDate order by b.beginDate) c
 cross apply 
     (select a.beginDate, a.endDate, a.FIO, a.Theme
		union all
	  select a.endDate, c.beginDate, '-', 'Ответы на вопросы'
	   where a.endDate<>c.beginDate and datediff(n,a.endDate,c.beginDate)<30 
		union all
	  select a.endDate, c.beginDate, '-', 'Обеденный перерыв'
	   where a.endDate<>c.beginDate and datediff(n,a.endDate,c.beginDate)>=30) d

union all

select  dateadd(n,30, max(vv2.value)), max(vv2.value), '-', 'Подведение итогов'
  from LSDBO.Ric_Get_objChild(100000563400035,'Стки,Стк') as rw left join
       lsdbo.attrib_value_view av2 on rw.id=av2.object_id and av2.attrib_id=3000000000083 left join 
       lsdbo.value_datetime_view vv2 on av2.value_id=vv2.id and av2.attrib_id=3000000000083
3 фев 15, 09:40    [17210313]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить