2010-09-16 54 views
2

我按時間接近分組了一些記錄。我現在做的權利(在unixtime時間戳),將組分割成單個記錄的有效方法

首先,我做選擇子搶那是我的興趣記錄,

(SELECT timestamp AS target_time FROM table WHERE something = cool) AS subselect 

然後我想看看是接近紀錄在那些時間,

SELECT id FROM table, subselect WHERE ABS(target_time - timestamp) < 1800 

但這裏是我打我的問題。我只想要在target_time周圍的記錄之間的時間差大於20分鐘的記錄。所以要做到這一點,我按target_time分組,並添加一個HAVING部分。

SELECT id FROM table, first WHERE ABS(target_time - timestamp) < 3600 
GROUP BY target_time HAVING MAX(timestamp) - MIN(timestamp) > 1200 

這是偉大的,所有我不喜歡的記錄都消失了,但現在我只顯示組,第一id當我真的希望所有的ids的。我可以使用GROUP_CONCAT,但是這給我一個混亂,我不能再做任何疑問。我真的希望得到所有這些創建的組返回的ids。我需要另外的SELECT聲明嗎?或者,有沒有更好的方法來構建我所得到的?

謝謝,

一個SQL結點。

+0

你想要什麼?你首先說你想按時間間隔分組。你這樣做,然後抱怨你每個組只能得到一個記錄,這是GROUP應該做的事情(以及你首先說你想要的)。所以我有些困惑。 – jira 2010-09-16 18:46:08

+0

對不起,我想我最初的問題隨着我寫這個問題而改變。真正的問題是我需要對記錄進行分組,以便使用聚合函數來刪除一些我不需要的記錄。但是,我需要去分組?我的記錄,所以我可以單獨訪問ID。我不知道最有效的方法。我會盡快編輯謝謝你。 – 2010-09-16 19:05:19

回答

0

我的假設是你想要的輸出,看起來像:

id1, timestamp1, fieldA, fieldB 
    id1, timestamp2, fieldA, fieldB 
    id2, timestamp3, fieldA, fieldB 
    id2, timestamp4, fieldA, fieldB 
    id3, timestamp5, fieldA, fieldB 
    id3, timestamp6, fieldA, fieldB 

但這些記錄的時間戳之間1200和1800秒的「target_time」的某個地方在哪裏=很酷?

SELECT data.id, data.timestamp, data.fieldA, data.fieldB, ..., data.fieldX 
    FROM events 
    JOIN data 
    WHERE events.something = cool_event -- Gives the 'target_time' of cool_event 
     AND ABS(event.timestamp - data.timestamp) BETWEEN 1200 and 1800 -- gives data records 'near' target time, but at least 20 minutes away. 

如果「數據」和「事件」表是相同的表,就用表的別名,但你可以加入一個表與自身,又稱爲「自聯接」。

SELECT data.id, data.timestamp, data.fieldA, data.fieldB, ..., data.fieldX 
    FROM events AS target, events AS data 
    WHERE target.something = cool_event -- gives the 'target_time' of cool_event 
     AND ABS(target.timestamp - data.timestamp) BETWEEN 1200 and 1800 -- gives data records 'near' target time, but at least 20 minutes away. 

這聽起來是正確的,沒有任何分組或聚合需要。

如果需要,您可以訂購結果數據。

- J·喬根森 -

+0

這不完全是我需要的。假設目標時間是午夜。我想要11:30-12:30的所有記錄。但是讓我們說當我得到這些記錄時,那時候的唯一記錄是從11:56-12:05。他們伸展的時間不夠長。所以我希望在目標時間周圍的所有記錄的ID都能延伸20分鐘以上。混淆我知道。 (因此賞金)。雖然謝謝! – 2010-09-21 20:16:45

1

見,如果我有你的問題正確:

對於表中給定的行,你想知道行集類似的記錄,如果時間戳的範圍那些記錄大於20分鐘。你想要這個表中的所有ID。

如果你只是想爲履行本標準ID的列表,這是相當簡單:

給定一個表,如:

create table foo (id bigint(4), section VARCHAR(2), modification datetime); 

,你可以這樣做:

select id, foo.section, min_max.min_modification, min_max.max_modification, abs(min_max.min_modification - min_max.max_modification) as diff 
from foo, 
(select section, max(modification) max_modification, min(modification) min_modification from foo as inner_foo group by section) as min_max 
where foo.section = min_max.section 
and abs(min_max.min_modification - min_max.max_modification) > 1800; 

你'根據「相似行」標準(在本例中爲列部分)進行子選擇,以獲取該部分的最小和最大時間戳。此最小值和最大值適用於該部分中的所有ID。因此,對於部分'A',您將獲得一個ID列表,與'B'部分相同。