2017-02-24 112 views
0

我有一個帶寬利用率數據表。每行都有主機名,niccardname,利用率和時間戳。在每個主機的最大時間戳處,可能有不同的NIC卡。 因此對於每個主機,我希望在最大時間戳下不同NIC卡的平均利用率。結果集行的平均數

下面是我的表結構,插入和查詢 -

CREATE TABLE bandwith_utilization 
(
    id integer NOT NULL, 
    hostname character varying(255), 
    "timestamp" bigint, 
    niccardname character varying(255), 
    percentageutilization integer, 
    CONSTRAINT bandwidth_utilization_pkey PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE bandwith_utilization 
    OWNER TO postgres; 


INSERT INTO bandwith_utilization 
VALUES (1,'host1','111111','nic1',40); 
INSERT INTO bandwith_utilization 
VALUES (2,'host1','111112','nic1',50); 
INSERT INTO bandwith_utilization 
VALUES (3,'host1','111113','nic1',50); 
INSERT INTO bandwith_utilization 
VALUES (4,'host1','111113','nic2',70); 

INSERT INTO bandwith_utilization 
VALUES (5,'host2','111111','nic1',80); 
INSERT INTO bandwith_utilization 
VALUES (6,'host2','111112','nic1',20); 
INSERT INTO bandwith_utilization 
VALUES (7,'host2','111112','nic2',30); 

INSERT INTO bandwith_utilization 
VALUES (8,'host3','111115','nic1',10); 

所以這是插入後,我的表 -

id hostname timestamp niccardname  percentageutilization 
------------------------------------------------------------------ 
1; "host1"; 111111;  "nic1";   40 
2; "host1"; 111112;  "nic1";   50 
3; "host1"; 111113;  "nic1";   50 
4; "host1"; 111113;  "nic2";   70 

5; "host2"; 111111;  "nic1";   80 
6; "host2"; 111112;  "nic1";   20 
7; "host2"; 111112;  "nic2";   30 

8; "host3"; 111115;  "nic1";   10 

我有一個查詢這給我的輸出在最大時間戳主機名 -

select hostname, timestamp, niccardname, percentageutilization 
from report.bandwith_utilization 
where timestamp = (select max(timestamp) 
        from report.bandwith_utilization nwUtil 
        where nwUtil.hostname = report.bandwith_utilization.hostname 
        ) ; 

以上查詢的輸出是 -

"host1"; 111113; "nic1"; 50 
"host1"; 111113; "nic2"; 70 

"host2"; 111112; "nic1"; 20 
"host2"; 111112; "nic2"; 30 

"host3"; 111115; "nic1"; 10 

所以現在我的預期輸出是每個主機不同NIC卡的平均利用率。即

"host1"; 111113; "nic1"; 60 
"host2"; 111112; "nic1"; 25 
"host3"; 111115; "nic1"; 10 

我如何才能找到最後的平均輸出與我在上面提到的相同的查詢?

+0

您使用的是MySQL還是Postgresql? (不要標記不涉及的產品。) – jarlh

+0

我刪除了MySQL標籤。這看起來像Postgres。 –

回答

1

應該是一個AVG()和GROUP BY

select hostname,timestamp,min(niccardname), avg(percentageutilization) 
from report.bandwith_utilization 
where (timestamp,hostname, niccardname) in (select max(timestamp) ,hostname, niccardname 
from report.bandwith_utilization nwUtil 
where nwUtil.hostname= report.bandwith_utilization.hostname 
group by hostname, niccardname 
) 
group by hostname,timestamp 
order by hostname,timestamp 
+0

它給了我最大的結果不是一般的。即我上面顯示的5個條目不是平均預期的3個條目。 ! – Abhimanyu

+0

@Abhimanyu已答覆更新 – scaisEdge

+0

還是一樣的結果:( – Abhimanyu

1

下面是一個好辦法,最大時間戳來獲得行:

select u.* 
from (select u.*, 
      rank() over (partition by hostname order by timestamp desc) as seqnum 
     from report.bandwith_utilization u 
    ) u 
where seqnum = 1; 

現在,你可以得到你想要的想:

select u.hostname, u.timestamp, avg(percentageutilization) 
from (select u.*, 
      rank() over (partition by hostname order by timestamp desc) as seqnum 
     from report.bandwith_utilization u 
    ) u 
where seqnum = 1 
group by u.hostname, u.timestamp; 

它沒有意義的(對我)包括在結果集中niccardname。如果你想要一個值,你可以使用min(niccardname),如果你想讓它們都在數組中,你可以使用min(niccardname)array_agg(niccardname)

+0

你是對的我不應該在結果集中包含niccardname。即使我不需要那樣。來查詢你上面所說的內容,我無法理解它,所以我可以告訴它在哪裏失敗 - 錯誤:在「訂單」(您在查詢中使用的第二個訂單)處或附近的語法錯誤。 – Abhimanyu

+0

@Abhimanyu。 。 。這應該是'分區'。我不知道爲什麼我討厭的手指這樣做。 –

+0

謝謝!有用 :) – Abhimanyu