2017-02-24 10 views
0

私は帯域幅使用率データのテーブルを持っています。各行には、ホスト名、NIC名、使用率、タイムスタンプがあります。各ホストの最大タイムスタンプでは、異なる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 

So Now My Expected putは、ホストごとに異なるNICカードの平均利用率です。すなわち

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

私が上記の同じクエリで最終平均出力を見つけるにはどうすればよいですか?今

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; 

、あなたは何をあなたを得ることができます:

+0

MySQLまたはPostgresqlを使用していますか? (含まれていない製品にはタグを付けないでください) – jarlh

+0

私はMySQLタグを削除しました。これはPostgresのようです。 –

答えて

1

以下は、最大のタイムスタンプで行を取得するためのより良い方法である

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

が更新 – scaisEdge

+0

まだ同じ結果:( – Abhimanyu

1

でAVG()とグループでなければなりません欲しい:

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が含まれるように(私には)意味がありません。 1つの値が必要な場合はmin(niccardname)を、配列内にすべての値を入れる場合はarray_agg(niccardname)を使用できます。

+0

あなたは正しいです。結果セットにniccardnameを含めるべきではありません。でも私はそれを必要としません。あなたが上で言ったことを尋ねると、私はそれから多くを理解することができませんでしたので、私はちょうどそれが失敗していることを伝えることができます - ERROR: "order"(2番目のOrder) @Abhimanyu。 – Abhimanyu

+0

。 。 。それは 'パーティションバイ 'でなければなりません。なぜ私の厄介な指がそれをしたのか分かりません。 –

+0

ありがとう!できます :) – Abhimanyu