2014-10-17 44 views
-1

我試圖通過最大STAMP列過濾掉表中的結果。我需要的結果是每個重複的ID號碼都要過濾掉,所以我擁有最大郵票的單個ID號碼。通過單個表中的最大值過濾掉重複結果

編輯:列定義 -

DOE - 日期時間變種 - varvarchar(4)latin1_swedish_ci ID - VARCHAR(9)latin1_swedish_ci 郵票 - BIGINT(20)

以下數據爲小片段 -

DATE    VAR  ID  STAMP 
01/09/2014 00:05 WEBN 13279 212276333136568000 
01/09/2014 00:06 WEBN 13084 212276333179962000 
01/09/2014 00:07 WEBN 13084 212276333236687000 
01/09/2014 00:25 WEBN 13192 212276334356964000 
01/09/2014 00:28 WEBN 13433 212276334517114000 
01/09/2014 00:29 WEBN 13433 212276334574072000 
01/09/2014 00:54 WEBN 13261 212276336085970000 
01/09/2014 01:24 WEBN 13208 212276337880800000 
01/09/2014 01:26 WEBN 13208 212276337972060000 
01/09/2014 01:41 WEBN 13256 212276338901120000 
01/09/2014 02:07 WEBN 13225 212276340440626000 
01/09/2014 02:28 WEBN 13048 212276341700449000 
01/09/2014 02:29 WEBN 13048 212276341789222000 
01/09/2014 02:31 WEBN 13217 212276341897262000 
01/09/2014 03:21 WEBN 13464 212276344870866000 
01/09/2014 03:22 WEBN 13464 212276344970040000 
01/09/2014 04:01 WEBN 13486 212276347260517000 
01/09/2014 04:02 WEBN 13486 212276347351666000 
01/09/2014 05:14 WEBN 13490 212276351690524000 
01/09/2014 05:16 WEBN 13490 212276351776728000 
01/09/2014 17:55 WEBN 13393 212276397317713000 
01/09/2014 18:17 WEBN 13253 212276398658967000 

以下查詢是我正在使用的。

CREATE TABLE SPC_VARCOLL AS SELECT m.* FROM var_x m 
WHERE m.DATE BETWEEN '2014-09-01 00:00:00' AND '2014-09-30 23:59:59' 
AND m.VAR= 'WEBN' 
AND m.STAMP = (SELECT MAX(m.STAMP) FROM var_x m2 WHERE m2.ID= m.ID) 

它過濾重複結果,但似乎過濾出非重複呢?我只在新創建的表格中得到45個結果,在那裏我應該變得更像1000.

任何想法?

+0

所以要清楚,你只需要結果中有STAMP = <最大STAMP值>的那些記錄? – 2014-10-17 08:27:45

+0

對不起,對於每個重複的ID我想要最大的戳記行 – Engl12 2014-10-17 08:29:24

+0

這是[tag:mysql]還是[tag:oracle]企業數據庫?當然,它不可能是兩個。 – Mureinik 2014-10-17 08:33:05

回答

1

你本是-ING三個過濾器:

WHERE m.DATA BETWEEN ... 
m.VAR = 'WEBN' 
m.STAMP = <subquery> 

這裏的問題是您的子查詢不會再應用前兩個過濾器。比方說,你有這個簡單的數據集:

DATE    VAR  ID STAMP 
01/09/2014 00:01 WEBN 1 100 
01/09/2014 00:05 WEBN 1 101 
01/09/2014 00:01 WEBN 2 200 
01/09/2014 00:25 WEBN 2 201 

現在,如果我們執行查詢(請注意日期過濾器)

SELECT m.* FROM var_x m 
WHERE m.DATE BETWEEN '2014-09-01 00:00:00' AND '2014-09-01 00:20:00' 
AND m.VAR= 'WEBN' 
AND m.STAMP = (SELECT MAX(m.STAMP) FROM var_x m2 WHERE m2.ID= m.ID) 

我們得到以下結果

01/09/2014 00:05 WEBN 1 101 

爲什麼ID 2不在那裏?因爲它不符合子查詢的標準,因爲MAX值是「全局」,而您正在查找過濾的MAX。具體而言,ID = 2的子查詢結果爲201,但該記錄不在過濾時間範圍內(00:00和00:20之間),因此它將被過濾掉。

使用這個查詢

SELECT m.* FROM var_x m 
WHERE m.DATE BETWEEN '2014-09-01 00:00:00' AND '2014-09-01 00:20:00' 
AND m.VAR= 'WEBN' 
AND m.STAMP = (
    SELECT MAX(m2.STAMP) 
    FROM var_x m2 
    WHERE m2.ID= m.ID 
    AND m2.DATE BETWEEN '2014-09-01 00:00:00' AND '2014-09-01 00:20:00' 
    AND m2.VAR= 'WEBN' 
) 

應產生所需的結果。

+0

嘗試了您的查詢,我得到更多的結果,但現在得到重複? – Engl12 2014-10-17 08:50:20

+0

抱歉,重複的ID與不同的郵票 – Engl12 2014-10-17 08:53:28

+0

STAMP列是一種數字數據類型,對不對? – 2014-10-17 08:56:22

0

我不明白爲什麼你的查詢不起作用。你可以得到預期的結果與數:

SELECT count(*) 
FROM var_x m 
WHERE m.DATE BETWEEN '2014-09-01 00:00:00' AND '2014-09-30 23:59:59' 
    AND m.VAR= 'WEBN' 
GROUP BY m.ID 
; 

我與Oracle 11g和上述另一種解決方案,最近總運營商:

SELECT max(m.DATE) keep (dense_rank last order by m.STAMP) DATE, 
     max(m.VAR) keep (dense_rank last order by m.STAMP) VAR, 
     m.ID, 
     max(m.STAMP) keep (dense_rank last order by m.STAMP) STAMP 
FROM var_x m 
WHERE m.DATE BETWEEN '2014-09-01 00:00:00' AND '2014-09-30 23:59:59' 
    AND m.VAR= 'WEBN' 
GROUP BY m.ID 
; 
+0

這將在MySQL的工作?我只選擇甲骨文,因爲有一個彈出窗口說我會得到更多的答案? – Engl12 2014-10-17 08:37:27

+0

我想不是 - 當然如果你選擇了一個不適當的標籤,更多的人會擔心你的問題,但你會得到像這樣的不適當的答案。 – Emmanuel 2014-10-17 10:31:59