Sql 将组划分为单个记录的有效方法
我根据时间的接近程度对一些记录进行分组。我现在所做的是在unixtime中添加时间戳 首先,我做一个子选择来获取我感兴趣的记录Sql 将组划分为单个记录的有效方法,sql,mysql,group-by,Sql,Mysql,Group By,我根据时间的接近程度对一些记录进行分组。我现在所做的是在unixtime中添加时间戳 首先,我做一个子选择来获取我感兴趣的记录 (SELECT timestamp AS target_time FROM table WHERE something = cool) AS subselect 然后我想看看那些在时间上接近这些的记录 SELECT id FROM table, subselect WHERE ABS(target_time - timestamp) < 1800 这很好,所
(SELECT timestamp AS target_time FROM table WHERE something = cool) AS subselect
然后我想看看那些在时间上接近这些的记录
SELECT id FROM table, subselect WHERE ABS(target_time - timestamp) < 1800
这很好,所有我不喜欢的记录都消失了,但现在我只有组的第一个id,而我真的想要所有的id。我可以使用GROUP_CONCAT,但这会让我变得一团糟,无法再进行查询。我真正想要的是从所有创建的组返回所有ID。我需要另一个SELECT语句吗?还是有更好的方法来组织我得到的
谢谢,
一个SQL nub。我的假设是您想要一个如下所示的输出:
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秒之间,其中something=cool
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.
如果“data”和“events”表是同一个表,则只需使用表别名,但您可以将一个表连接到自身,也称为“SELF-join”
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 Jorgenson-看看我是否能纠正您的问题: 对于表中的给定行,如果类似记录的时间戳范围大于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”部分相同。您到底想要什么?你首先说你想按时间间隔分组。你们这样做,然后抱怨你们每个小组只得到一张记录,这是小组应该做的,也是你们第一次说你们想要的。所以我有点困惑。对不起,我想我最初的问题在写问题的时候变了。真正的问题是我需要对记录进行分组,以便使用聚合函数删除一些我不需要的记录。但是我需要去分组?我的记录,以便我可以单独访问ID。我不知道最有效的方法。我会做一个快速编辑谢谢。那不是我需要的。假设目标时间是午夜。我要11:30-12:30的所有记录。但如果我得到这些记录,那时候只有11:56-12:05的记录。他们伸展的时间不够长。因此,我需要组返回的目标时间周围所有记录的ID超过20分钟。我知道。因此得到了赏金。谢谢你!
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;