[SQL] Помогите с запросом
От: Darkman_VLT Россия  
Дата: 03.03.06 22:26
Оценка:
Имеется табличка:
host_id integer,
event_id integer,
created timestamp;

--example---
1 1 10:12
1 2 11:20
1 1 12:50
---
event_id=1 on
event_id=2 off

итого, мы получаем:
1 хост в 10:12 — on, в 11:20 off и с 12:50 по сей момент находится в состоянии on

В итоге очень нужно получить это ввиде таблицы:
host_id created_on created_off
--example--
1 10:12 11:20
1 12:50 NULL

Последовательность действий контролируется тригером и они возможны только в порядке
on-off-on-off-on-...
порядка действий в on-on-off-off или похожих — не возможно.

Уже замучался с разными вариациями self join итд.
Помогите плз.

P.S. SQL в реализации Postgres'a
Re: [SQL] Помогите с запросом
От: Hemul  
Дата: 05.03.06 09:19
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

D_V>Имеется табличка

D_V>В итоге очень нужно получить это ввиде таблицы:
D_V>host_id created_on created_off
D_V>--example--
D_V>1 10:12 11:20
D_V>1 12:50 NULL

select t1.host_id, t1.created as created_on, min( t2.created ) as created_off
from t t1 left join t t2 
on t2.host_id = t1.host_id 
and t2.created > t1.created
where 
t1.event_id = 1
and isnull( t2.event_id, 2 ) = 2
group by
t1.host_id, t1.created

D_V>P.S. SQL в реализации Postgres'a
Проверено на mssql. В Postgres должно быть также
Re[2]: [SQL] Спасибо, но есть уточнение (isnull)
От: Darkman_VLT Россия  
Дата: 06.03.06 03:51
Оценка:
H>
H>select t1.host_id, t1.created as created_on, min( t2.created ) as created_off
H>from t t1 left join t t2 
H>on t2.host_id = t1.host_id 
H>and t2.created > t1.created
H>where 
H>t1.event_id = 1
H>and isnull( t2.event_id, 2 ) = 2
H>group by
H>t1.host_id, t1.created
H>

D_V>>P.S. SQL в реализации Postgres'a

H>Проверено на mssql. В Postgres должно быть также


Мне не совсем понятно логика работы запроса.
А ещё более не понятна конструкция isnull( t2.event_id, 2 ) = 2

Не могли бы обьяснить, более точнее по какому принципу Вы делаете LEFT JOIN (t1.host_id=t2.host_id — понятно )
Re[3]: [SQL] Спасибо, но есть уточнение (isnull)
От: FunnyRabbit Россия  
Дата: 06.03.06 07:10
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

H>>
H>>select t1.host_id, t1.created as created_on, min( t2.created ) as created_off
H>>from t t1 left join t t2 
H>>on t2.host_id = t1.host_id 
H>>and t2.created > t1.created
H>>where 
H>>t1.event_id = 1
H>>and isnull( t2.event_id, 2 ) = 2
H>>group by
H>>t1.host_id, t1.created
H>>

D_V>>>P.S. SQL в реализации Postgres'a


D_V>А ещё более не понятна конструкция isnull( t2.event_id, 2 ) = 2


Это означает, что если t2.event_id будет NULL, то вместо него подставить 2 и сравниться с 2. Т.о. здесь приводиться t2.event_id к 2 ибо значения могут быть числовыми (0, 1, 2, ...100,...) и NULL и пожтому с NULL сравнивать не получиться. Значит надо привести NULL к числу, которое нам необходимо. В Oracle isnull имеет синоним NVL.
То что меня не убивает, делает меня умнее.
Re[4]: [SQL] Ещё больше не понятно (isnull)
От: Darkman_VLT Россия  
Дата: 06.03.06 07:35
Оценка:
FR>Это означает, что если t2.event_id будет NULL, то вместо него подставить 2 и сравниться с 2. Т.о. здесь приводиться t2.event_id к 2 ибо значения могут быть числовыми (0, 1, 2, ...100,...) и NULL и пожтому с NULL сравнивать не получиться. Значит надо привести NULL к числу, которое нам необходимо. В Oracle isnull имеет синоним NVL.


--Это означает, что если t2.event_id будет NULL, то вместо него подставить 2 и сравниться с 2.

Вообще не понял
Зачем сравнивать с 2, если мы уже к 2йке привели?
Re[3]: [SQL] Спасибо, но есть уточнение (isnull)
От: Hemul  
Дата: 06.03.06 07:38
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

H>>
H>>select t1.host_id, t1.created as created_on, min( t2.created ) as created_off
H>>from t t1 left join t t2 
H>>on t2.host_id = t1.host_id 
H>>and t2.created > t1.created
H>>where 
H>>t1.event_id = 1
H>>and isnull( t2.event_id, 2 ) = 2
H>>group by
H>>t1.host_id, t1.created
H>>

D_V>Мне не совсем понятно логика работы запроса.
D_V>А ещё более не понятна конструкция isnull( t2.event_id, 2 ) = 2
isnull( t2.event_id, 2 ) = 2 отрабатывает ситуацию 1 12:50 NULL
если после on, не последовал off, то в t2 не будет соответствия для t1, и соответственно t2.event_id будет нуллом.

D_V>Не могли бы обьяснить, более точнее по какому принципу Вы делаете LEFT JOIN (t1.host_id=t2.host_id — понятно )

Ну а что конкретно неясно c left join? t2.created > t1.created означает, что off по времени идет после on

Вообще-то запрос довольно примитивный. Проще самому поизменять его и понять, что и как он выбирает.
Re: [SQL] Спасибо всем [CLOSED]
От: Darkman_VLT Россия  
Дата: 06.03.06 08:48
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

D_V>Имеется табличка:

D_V>host_id integer,
D_V>event_id integer,
D_V>created timestamp;

D_V>--example---

D_V>1 1 10:12
D_V>1 2 11:20
D_V>1 1 12:50
D_V>---
D_V>event_id=1 on
D_V>event_id=2 off

D_V>итого, мы получаем:

D_V>1 хост в 10:12 — on, в 11:20 off и с 12:50 по сей момент находится в состоянии on

D_V>В итоге очень нужно получить это ввиде таблицы:

D_V>host_id created_on created_off
D_V>--example--
D_V>1 10:12 11:20
D_V>1 12:50 NULL

D_V>Последовательность действий контролируется тригером и они возможны только в порядке

D_V>on-off-on-off-on-...
D_V>порядка действий в on-on-off-off или похожих — не возможно.

D_V>Уже замучался с разными вариациями self join итд.

D_V>Помогите плз.

D_V>P.S. SQL в реализации Postgres'a
Re: [BUG] Помогите с запросом
От: Darkman_VLT Россия  
Дата: 11.03.06 17:41
Оценка:
Ранее обсуждалось
Автор: Darkman_VLT
Дата: 04.03.06

Из веше сказанного замечен баг в запросе, а именно:
1 — on
2 — off

event_num host_id event_id created
1 1 1 10:00
2 1 2 10:00

В этом случаи запрос:
select t1.host_id, t1.created as created_on, min( t2.created ) as created_off
from t t1 left join t t2 
on t2.host_id = t1.host_id 
and t2.created > t1.created
where 
t1.event_id = 1
and isnull( t2.event_id, 2 ) = 2
group by
t1.host_id, t1.created


Работать не будет
Помогите, исправить.

Правка:
 and t2.created > t1.created

на >= не даёт нужного эфекта, понятное дело.
А как привязатся к event_id (порядковому номеру, primary index) чёт не получается.
Re[2]: [BUG] Иточнение
От: Darkman_VLT Россия  
Дата: 11.03.06 18:06
Оценка:
Более точно оно выглядило бы так:
(возможно при первом вопросе, я не совсем корректно обьяснил задачу)
1 — on
2 — off

event_num host_id event_id created
<1> <1> <1> <10:00>
<2> <1> <X> <xx:xx:xx> (таких может быть много)
<3> <1> <2> <10:00>

Но интервал on-off не перекрывается в пределах одного пользователя на одном host_id.

Не знаю, как обьяснить словами, попробую в XML'e

-Только так-
<on></on>
  <one></one>
  <two></two>
<off></off>

Ситуация
<on>
 <one></one>
 <off>
</on>
</off>

Тригером закрыта.

Но между on и off может быть сколько угодно разных ивентов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.