Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将组划分为单个记录的有效方法_Sql_Mysql_Group By - Fatal编程技术网

Sql 将组划分为单个记录的有效方法

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 这很好,所

我根据时间的接近程度对一些记录进行分组。我现在所做的是在unixtime中添加时间戳

首先,我做一个子选择来获取我感兴趣的记录

(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;