2017-02-24 43 views
0

我有一個cpu利用率數據表。每行都有一個主機名,利用率和時間戳。我想選擇特定主機的最高時間戳中的所有主機和CPU利用率。根據最高時間戳選擇每個主機名的利用率百分比

下面是我的表結構,插入和選擇

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


INSERT INTO cpu_utilization 
VALUES (1,'host1','111111',10); 
INSERT INTO cpu_utilization 
VALUES (2,'host1','111112',12); 
INSERT INTO cpu_utilization 
VALUES (3,'host1','111113',15); 

INSERT INTO cpu_utilization 
VALUES (4,'host2','111111',20); 
INSERT INTO cpu_utilization 
VALUES (5,'host2','111112',22); 
INSERT INTO cpu_utilization 
VALUES (6,'host2','111113',25); 

INSERT INTO cpu_utilization 
VALUES (7,'host3','111111',10); 

,我執行這個選擇查詢

select * from cpu_utilization where timestamp in (select max(timestamp) from cpu_utilization group by hostname); 

什麼我得到的輸出是 -

id; hostname timestamp cpuutilizationpercentage 
1; "host1"; 111111;  10 
3; "host1"; 111113;  15 
4; "host2"; 111111;  20 
6; "host2"; 111113;  25 
7; "host3"; 111111;  10 

但我期待輸出爲 -

id; hostname timestamp cpuutilizationpercentage 
3; "host1"; 111113;  15 
6; "host2"; 111113;  25 
7; "host3"; 111111;  10 

我的選擇查詢有什麼問題,有什麼想法?

+1

看起來像今天是類似問題的一天。我剛剛在這裏回答了一個問題:http://stackoverflow.com/questions/42430671/how-to-solve-this-using-a-subquery-in-a-from-clause/42430777#42430777 – cha

+1

只需使用關聯子查詢或內部聯接 – cha

+0

您的子查詢返回兩個時間戳「111113」和「111111」,這兩個時間戳對於不同的主機名是最大的。這樣你就可以得到具有這些時間戳的所有行。使用相關的子查詢作爲@cha建議和'='而不是'in'。 –

回答

1

謝謝@cha,我錯誤地做了id的where子句,而應該在主機名上。 我得到了期望的輸出 -

select * from cpu_utilization where timestamp = (select max(timestamp) from cpu_utilization cpuutil where cpuutil.hostname=cpu_utilization.hostname); 
+0

好工作。也嘗試與內部聯接。與相關子查詢相比,內部連接版本有時性能更好 – cha

相關問題