2010-09-16 27 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'部分相同。

相关问题