Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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_Ruby_Postgresql - Fatal编程技术网

在SQL中,如何根据行之间的列差异进行分组?

在SQL中,如何根据行之间的列差异进行分组?,sql,ruby,postgresql,Sql,Ruby,Postgresql,我有一个在时间戳处创建了一个_的事件表。我想把它们分成N秒间隔的事件组,特别是130秒。然后对于每个组,我只需要知道最低时间戳和最高时间戳 以下是一些忽略时间戳格式的示例数据,它是一个datetime字段: ------------------------ | id | created_at | ------------------------ | 1 | 2013-1-20-08:00 | | 2 | 2013-1-20-08:01 | | 3 | 2013-1-20-08:0

我有一个在时间戳处创建了一个_的事件表。我想把它们分成N秒间隔的事件组,特别是130秒。然后对于每个组,我只需要知道最低时间戳和最高时间戳

以下是一些忽略时间戳格式的示例数据,它是一个datetime字段:

------------------------ | id | created_at | ------------------------ | 1 | 2013-1-20-08:00 | | 2 | 2013-1-20-08:01 | | 3 | 2013-1-20-08:05 | | 4 | 2013-1-20-08:07 | | 5 | 2013-1-20-08:09 | | 6 | 2013-1-20-08:12 | | 7 | 2013-1-20-08:20 | ------------------------ 我希望得到的结果是:

------------------------------------- | started_at | ended_at | ------------------------------------- | 2013-1-20-08:00 | 2013-1-20-08:01 | | 2013-1-20-08:05 | 2013-1-20-08:09 | | 2013-1-20-08:12 | 2013-1-20-08:12 | | 2013-1-20-08:20 | 2013-1-20-08:20 | ------------------------------------- 我已经在谷歌上搜索了所有可能的措辞方式,并尝试了一段时间,但我还是搞不懂。我已经可以在Ruby中这样做了,我只是想弄清楚是否有可能将其移动到数据库级别。如果你好奇或者更容易想象,下面是Ruby中的外观:

groups = SortedSet[*events].divide { |a,b| (a.created_at - b.created_at).abs <= 130 }
groups.map do |group|
  { started_at: group.to_a.first.created_at, ended_at: group.to_a.last.created_at }
end

有人知道如何在SQL中,特别是在PostgreSQL中实现这一点吗?

我认为您希望在与前一个分组的差异大于130秒时启动每个新分组。您可以使用滞后和日期算法来确定分组的起始位置。然后进行累积求和以获得分组:

select Grouping, min(created_at), max(created_at)
from (select t.*, sum(GroupStartFlag) over (order by created_at) as Grouping
      from (select t.*,
                   lag(created_at) over (order by created_at) as prevca,
                   (case when extract(epoch from created_at - lag(created_at) over (order by created_at)) < 130
                         then 0 else 1
                    end) as GroupStartFlag
            from t
           ) t
     ) t
group by Grouping;

最后一步是通过分组标识符进行聚合,以获得最早和最新的日期。

作为CREATE TABLE语句的模式,加上插入的示例数据和所需结果的概要,将非常有用。通常你在这类事情中要做的是得到历元秒数,除以间隔,然后根据结果分组。你能提供一些样本数据吗?我不熟悉Ruby语法。是的,很抱歉。我对问题进行了编辑,以包含样本数据和预期结果。谢谢哇,我从没听说过一半的功能。嗯,不太管用。我只退了两排,这绝对不对。@BrandonWeiss。我想我把国旗的定义倒过来了。我不认为是这样,我得到了相同的结果,只是顺序相反。@BrandonWeiss。我的累计总和是分区的,而不是按顺序排列的。我现在已经很晚了,它起作用了!我向你脱帽致意——我在这件事上做了一段时间。“如果你不想我问的话,”CraigRinger提到使用提取历元、间隔和除法。这些工具我也认为是正确的,但我不知道如何使用它们来获得我想要的结果。是否有一个更简单的解决方案涉及这些问题,或者这是唯一的方法?