【问题标题】:Postgresql group by recurring itemsPostgresql 按重复项目分组
【发布时间】:2018-07-29 03:21:00
【问题描述】:

我正在使用 postgresql 来存储来自 RTLS 平台的历史数据。 位置数据不是连续收集的。 history_movements 实现为单个表,如下所示(它是一个简化的表,但足以展示用例):

User   Area   EnterTime               ExitTime
John   room1  2018-01-01 10:00:00     2018-01-01 10:00:05
Doe    room1  2018-01-01 10:00:00     2018-01-01 10:10:00
John   room1  2018-01-01 10:05:00     2018-01-01 10:10:00
Doe    room1  2018-01-01 10:20:00     2018-01-01 10:30:00
John   room2  2018-01-01 11:00:00     2018-01-01 11:05:00
John   room2  2018-01-01 11:08:00     2018-01-01 11:15:00
John   room1  2018-01-01 12:00:00     2018-01-01 12:08:00
John   room1  2018-01-01 12:10:00     2018-01-01 12:20:00
John   room1  2018-01-01 12:25:00     2018-01-01 12:25:00
John   room3  2018-01-01 12:30:00     2018-01-01 12:35:00
John   room3  2018-01-01 12:40:00     2018-01-01 12:50:00

我正在寻找一种查询方法,显示用户在各个房间中的停留情况,聚合与同一房间相关的数据并计算总体停留时间,如下所示

User  Area    EnterTime               ExitTime              ArregateTime
John  room1   2018-01-01 10:00:00     2018-01-01 10:10:00   00:10:00
John  room2   2018-01-01 11:00:00     2018-01-01 11:05:00   00:15:00
John  room1   2018-01-01 12:00:00     2018-01-01 12:25:00   00:25:00
John  room3   2018-01-01 12:30:00     2018-01-01 12:50:00   00:20:00
Doe   room1   2018-01-01 10:00:00     2018-01-01 10:30:00   00:30:00

查看各种线程,我很确定我必须使用滞后和按函数分区,但不清楚如何。 有什么提示吗? 最好的问候。

【问题讨论】:

  • 您好,我认为问题已得到解释,但我不知道如何进行查询,如果不够,我很抱歉或那样

标签: postgresql group-by lag partition-by


【解决方案1】:

AggregateTime 在您的预期结果中并不是真正的aggregate。对于每个 blockmax_timemin_time 之间似乎存在差异,其中每个块都是一组具有相同 (users, area) 的连续行。

with block as(
    select users, area, entertime, exittime,     
         (row_number() over (order by users, entertime) -
          row_number() over (partition by users, area order by entertime)
         ) as grp
    from your_table
    order by 1,2,3
)
select users, area, entertime, exittime, (exittime - entertime) as duration
from (select users, area, grp, min(entertime) as entertime, max(exittime) as exittime
      from block
      group by users, area, grp
    ) t2
order by 5;

我对“Resetting Row number according to record data change”进行了一些更改以得出解决方案。

【讨论】:

  • 嗨,我已经用我的表创建和您建议的查询创建了一个 sqlfiddle,sqlfiddle.com/#!15/0d8db/2/0 如果您查看“块”部分,当徽章 b 时 grp 列不会改变从a区到b区,也许我犯了任何错误。谢谢
  • grp 编号不会改变,但(badge, area, grp) 列的组合从(B,A,3) 更改为您关心的(B, B, 3)。这还不足以解决您的问题吗?
  • 嗨,我无法测试整个查询(删除 cmets),因为我有一个错误 ERROR: syntax error at or near "select" Position: 293 有什么提示吗?非常感谢
  • @DanGrow 工作示例:sqlfiddle.com/#!15/0d8db/6/0 我意识到您提供的预期输出不一致。第二行 John, room2 的退出时间应该是 2018-01-01 11:15:00 如果我正确理解您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2014-08-14
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多