2013-05-15 52 views
1

這是一個奇怪的問題。讓我擺出我的表結構...用於組合在單獨列中具有重疊日期的行的SQL查詢

我'服務器'表給我我的服務器的狀態信息(我每分鐘收到一些這些消息)。我的'客戶'表更新客戶端信息(顯然,客戶端連接到服務器)。

集羣中的一臺服務器始終是「主」,可以這麼說(其他都是次要的)。每個客戶端都會向我的每臺服務器提供延遲信息。

我需要查看客戶端延遲大於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'。

如果您在兩個表中使用時間,哪些規則必須知道服務器的角色。