2013-05-15 3 views
1

Это странный вопрос. позвольте мне выложить мои табличные структуры ...SQL-запрос для объединения строк с перекрывающимися датами в отдельных столбцах

Моя таблица «server» дает мне информацию о статусе моих серверов (я получаю несколько из этих сообщений каждую минуту). моя таблица «клиент» обновляется информацией о клиенте (очевидно, клиенты, подключенные к серверам).

Один сервер в кластере всегда является «основным», так сказать (другие являются второстепенными). каждый клиент доставляет мне информацию о задержках на каждый из моих серверов.

Мне нужно увидеть строки, где латентность клиента больше 60 секунд, но мне также нужно знать статус каждого сервера.

вот пример таблицы (сервер, то клиент):

server_name | server_role |  sstat_time 
--------------+-----------------+---------------------- 
    server1  | PRIMARY  | 2013-05-15 01:01:00 
    server2  | SECONDARY  | 2013-05-15 01:02:00 
    server3  | SECONDARY  | 2013-05-15 01:02:00 
    server1  | PRIMARY  | 2013-05-15 01:05:00 
    server2  | SECONDARY  | 2013-05-15 01:06:00 
    server3  | PRIMARY  | 2013-05-15 01:10:00 
    server1  | SECONDARY  | 2013-05-15 01:11:00 
    server1  | PRIMARY  | 2013-05-15 01:22:00 
    server3  | SECONDARY  | 2013-05-15 01:23:00 

клиент:

client_name | server_dest | latency |  cstat_time 
    ------------+---------------+-----------+-------------------- 
    client1 | server1  | 2  | 2013-05-15 01:01:30 
    client2 | server2  | 68  | 2013-05-15 01:01:40 
    client2 | server1  | 99  | 2013-05-15 01:01:50 
    client1 | server3  | 5  | 2013-05-15 01:10:00 
    client2 | server3  | 78  | 2013-05-15 01:10:30 
    client2 | server1  | 15  | 2013-05-15 01:10:50 

так, мой желаемый результат этого запроса будет:

client_name | server_name | latency | server_role | cstat_time 
--------------+---------------+-----------+--------------+-------------------- 
    client2 | server2  | 68  | SECONDARY | 2013-05-15 01:01:04 
    client2 | server1  | 99  | PRIMARY  | 2013-05-15 01:01:50 
    client2 | server3  | 78  | PRIMARY  | 2013-05-15 01:10:30 

я необходимо знать, когда эта задержка составляет более 60 секунд, а также роль скрытого сервера в этот момент времени.

любой ключ, как это сделать?

Я работаю на Postgres 8.4.

ответ

2

Если я правильно понял, вы пытаетесь определить роль сервера в течение определенного времени. Понимание того, что время начала предоставляется, но время окончания находится на следующей строке для этого сервера. Чтобы решить эту проблему, вам необходимо создать временную таблицу с начальным и конечным временем в той же строке, чтобы разрешить операцию JOIN BETWEEN.Так это будет выглядеть в MS SQL (К сожалению, вы, возможно, придется перевести на Postgres)

-- This is TSQL code SQL Server 2008 compatible 
create table #svr(
    server_name varchar(10), 
    server_role varchar(10), 
    stime datetime 
) 
create table #client(
    client_name varchar(10), 
    server_name varchar(10), 
    latency int, 
    ctime datetime 
) 
create table #role(
    server_name varchar(10), 
    server_role varchar(10), 
    stime datetime, 
    etime datetime 
) 
insert #svr values 
    ('server1','PRIMARY','2013-05-15 01:01:00'), 
    ('server2','SECONDARY','2013-05-15 01:02:00'), 
    ('server3','SECONDARY','2013-05-15 01:02:00'), 
    ('server1','PRIMARY','2013-05-15 01:05:00'), 
    ('server2','SECONDARY','2013-05-15 01:06:00'), 
    ('server3','PRIMARY','2013-05-15 01:10:00'), 
    ('server1','SECONDARY','2013-05-15 01:11:00'), 
    ('server1','PRIMARY','2013-05-15 01:22:00'), 
    ('server3','SECONDARY','2013-05-15 01:23:00') 

insert #client values 
('client1','server1',2,'2013-05-15 01:01:30'), 
('client2','server2',68,'2013-05-15 01:01:40'), 
('client2','server1',99,'2013-05-15 01:01:50'), 
('client1','server3',5,'2013-05-15 01:10:00'), 
('client2','server3',78,'2013-05-15 01:10:30'), 
('client2','server1',15,'2013-05-15 01:10:50') 

insert #role 
select s1.server_name, s1.server_role, s1.stime, s2.stime 
from ( select row_number() over(order by server_name,stime) as RowId,* 
     from #svr 
    ) as s1 
join ( select row_number() over(order by server_name,stime) as RowId,* 
     from #svr 
    ) as s2 
on s1.RowId = s2.RowId-1 

select C.client_name, C.server_name, C.latency, R.server_role, C.ctime 
from #client C 
left join #role R on R.server_name = C.server_name 
and C.ctime between R.stime and R.etime 
WHERE C.latency > 60 

Вот результат:

Result in SSMS

+0

это действительно лучший вариант. это не дало мне нескольких результатов, как и остальные. простых объединений было недостаточно. это сделало трюк. Спасибо большое. – jasonmclose

0

Это простое соединение запрос, если я правильно понимаю:

select c.*, sys.server_role 
from client c left outer join 
    server s 
    on c.server_desc = s.server_name 
where c.latency > 60 
1

привет здесь является решение

SELECT C.Client_name , S.Server_name, C.latency , S.Server_role, C.Cstat_time 
from Server_table S 
INNER JOIN Client C 
ON C.server_dest = S.server_name 
Where C.latency > 60 
1

В модели, представленной, я вижу, что вы не можете получить данные «server_role» с простым пересечением двух таблиц (клиент и сервер) с именем сервера.

Разъяснение этого запроса

select c. *, s.server_role 
from client c left outer join server s    
on c.server_dest = s.server_name 
where c.latency> 60 

Мы возвратили следующую информацию:

client_name | server_name | latency | server_role | cstat_time 
--------------+---------------+-----------+--------------+-------------------- 
    client2 | server2  | 68  | SECONDARY | 2013-05-15 01:01:40 
    client2 | server2  | 68  | SECONDARY | 2013-05-15 01:01:40 
    client2 | server1  | 99  | PRIMARY  | 2013-05-15 01:01:50 
    client2 | server1  | 99  | PRIMARY  | 2013-05-15 01:01:50 
    client2 | server1  | 99  | SECONDARY | 2013-05-15 01:01:50 
    client2 | server1  | 99  | PRIMARY  | 2013-05-15 01:01:50 
    client2 | server3  | 78  | SECONDARY | 2013-05-15 01:10:30 
    client2 | server3  | 78  | PRIMARY  | 2013-05-15 01:10:30 
    client2 | server3  | 78  | SECONDARY | 2013-05-15 01:10:30 

Я хотел бы спросить, что анализ сделал, чтобы получить что первостепенную роль сервера, когда задержка 99, чтобы получить client2 - сервер 'server2'.

Какие правила должны знать о роли сервера, если вы используете время в двух таблицах.