当前位置: 首页 > 面试题库 >

用Postgresql合并连续的行

高琛
2023-03-14
问题内容

我有这样一张slots桌子:

   Column   |            Type             |
------------+-----------------------------+
 id         | integer                     |
 begin_at   | timestamp without time zone |
 end_at     | timestamp without time zone |
 user_id    | integer                     |

而且我想选择连续的合并行。假设我有(简化)的资料,例如:

(1, 5:15, 5:30, 1)
(2, 5:15, 5:30, 2)
(3, 5:30, 5:45, 2)
(4, 5:45, 6:00, 2)
(5, 8:15, 8:30, 2)
(6, 8:30, 8:45, 2)

我想知道是否可以选择格式如下的行:

(5:15, 5:30, 1)
(5:15, 6:00, 2) // <======= rows id 2,3 and 4 merged
(8:15, 8:45, 2) // <======= rows id 5 and 6 merged

编辑: 这是SQLfiddle

我正在使用9.3版的Postgresql!

谢谢!


问题答案:

这是解决此问题的一种方法。创建确定是否一个纪录做了标志 重叠的前一个。这是一个小组的开始。然后取该标志的累积总和并将其用于分组:

select user_id, min(begin_at) as begin_at, max(end_at) as end_at
from (select s.*, sum(startflag) over (partition by user_id order by begin_at) as grp
      from (select s.*,
                   (case when lag(end_at) over (partition by user_id order by begin_at) >= begin_at
                         then 0 else 1
                    end) as startflag
            from slots s
           ) s
     ) s
group by user_id, grp;

这是一个SQL Fiddle。



 类似资料:
  • 在我的代码(Javascript)中,我使用了套接字。io将base64数据从代理传输到客户端,以建立视频通话功能。为此,每5秒或10秒,我将使用mediaRecorder录制视频,并将其发送到base64中的客户端,该客户端将每10秒转换为blob。 问题:所以,我想知道我可以在每10秒合并一个新的Blob,同时播放视频吗? 我已经尝试使用createObjectURL(blob),但这不起作用

  • 我有一个表,在列中包含以下值: 表(col1, col2, col3, col4, col5, col6): 因此,我希望有一行: 怎么做?

  • 我有一个有许多记录的表。它有以下结构: 表(col1、col2、col3、col4、col5、col6): 还有很多很多其他的行。 因此,我想要一张桌子: 表(col1,col2,col3,col4_1,col4_2,col4_3,col5_1,col5_2,col5_3,col6_1,col6_2,col6_3): 换句话说:表中的某些部分具有相同的,但不同的。每个相同的行数在1-3之间变化(事

  • 问题内容: 这个问题的标题不准确,但我不知道如何总结。如果可以的话,请随时重新编写! 这是两个表的摘录: 桌子 桌子 我需要合并这些表以获得此输出: 我找不到正确的查询。我需要下面类似的内容(我知道它不能完成工作),但是如何将所有代码和年份合并到一个表中,因为代码和年份在两个表中都没有重复… 以下是用于快速创建上述表的SQL脚本: 问题答案: 宇很可能是在寻找对

  • 问题内容: 使用运算符将产生以下结果: 我希望能够实现以下结果(对于操作员来说只是一个占位符): 因此,您可以看到顶级键的子值已“合并”,使得结果包含和。 如何在Postgres中“深度”合并两个 JSONB 值? 如果可能的话,这可能吗? 一个更复杂的测试用例: 原始“合并”并成为对象的另一个测试用例: 问题答案: 您应该合并两个值都使用的未嵌套元素。在不平凡的查询中执行此操作可能会感到不舒服,

  • 问题内容: 我有一个这样的表来保存体检的结果以及发送报告的日期和结果。实际上,发送的日期是基于临床访问日期。客户可以拥有一个或多个报告(日期可能有所不同) 我想从上述数据中提取以下报告。 我正在研究Postgresql。“交叉表”功能在这里无法使用,因为每个客户端的“ date_sent”不一致。 任何人都可以粗略地提出一个应如何查询的想法吗? 问题答案: 我建议采用以下方法: 它的输出格式不完全