2017-02-24 6 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 

그래서 Now My Expected out은 각 호스트마다 다른 NIC 카드의 평균 활용도 (%)입니다. 즉

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

위에서 언급 한 동일한 쿼리에서 최종 평균 출력을 어떻게 찾을 수 있습니까?

+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.* 
from (select u.*, 
      rank() over (partition by hostname order by timestamp desc) as seqnum 
     from report.bandwith_utilization u 
    ) u 
where seqnum = 1; 

을, 당신은 당신이 무엇을 얻을 수 있습니다 원하는 : 그것은 (나에게) 이해가되지 않습니다 결과 집합의 niccardname를 포함

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; 

. 하나의 값을 원할 경우 min(niccardname)을 사용할 수 있으며 모든 배열에 원하면 array_agg(niccardname)을 사용할 수 있습니다.

+0

당신은 맞습니다. 결과 집합에 niccardname을 포함해서는 안됩니다. 심지어 나는 그것을 필요로하지 않는다. 위에서 말한 내용을 쿼리하면 많은 것을 이해할 수 없으므로 오류가 발생한 부분을 알 수 있습니다. - 오류 : "order"또는 근처의 구문 오류 (쿼리에서 사용한 두 번째 순서). – Abhimanyu

+0

@Abhimanyu. . . 그것은 '파티션 단위'이어야합니다. 왜 내 성가신 손가락이 그랬는지 모르겠다. –

+0

감사합니다! 그것은 작동합니다 :) – Abhimanyu