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

PostgreSQL表相同数据最后一次相邻发生和第一行

鲜于宜修
2023-03-14
问题内容

我有一个程序,该程序每分钟通过PING检查网络中计算机的状态。每次它将向数据库插入新行,如下所示(我使用的是postgresql)

id_status   status   checking_time(timestamp)   id_device(int)



1           OK       '2017-01-01 00:00:00'      1
2           OK       '2017-01-01 00:00:00'      2
3           OK       '2017-01-01 00:00:00'      3

4           Failed   '2017-01-01 00:01:00'      1
5           OK       '2017-01-01 00:01:00'      2
6           OK       '2017-01-01 00:01:00'      3

7           Failed   '2017-01-01 00:02:00'      1
8           OK       '2017-01-01 00:02:00'      2
9           OK       '2017-01-01 00:02:00'      3

10          Failed   '2017-01-01 00:03:00'      1
11          OK       '2017-01-01 00:03:00'      2
12          OK       '2017-01-01 00:03:00'      3

13          OK       '2017-01-01 00:04:00'      1
14          OK       '2017-01-01 00:04:00'      2
15          OK       '2017-01-01 00:04:00'      3

我希望结果如下

status   from_time(timestamp)    to_time(timestamp)      id_device(int)



OK       '2017-01-01 00:00:00'   '2017-01-01 00:01:00'   1
Failed   '2017-01-01 00:01:00'   '2017-01-01 00:04:00'   1
OK       '2017-01-01 00:04:00'   NOW                     1

OK       '2017-01-01 00:00:00'   NOW                     2
OK       '2017-01-01 00:00:00'   NOW                     3

如何获得此输出?


问题答案:

这是差距和孤岛的问题。可以解决如下:

select t.status, 
   t.from_time, 
   coalesce(CAST(lead(from_time) over (partition by id_device order by from_time) AS varchar(20)), 'NOW') to_date, 
   t.id_device
from
(
    select t.status, min(checking_time) from_time, t.id_device
    from
    (
        select *, row_number() over (partition by id_device, status order by checking_time) - 
                  row_number() over (partition by id_device order by checking_time) grn
        from data
    ) t
    group by t.id_device, grn, t.status
) t
order by  t.id_device, t.from_time

dbffile演示

关键是最嵌套的子查询,在该子查询中,我使用两个row_number函数来隔离设备上相同状态的连续出现。一旦有了grn价值,剩下的就很容易了。

结果

status  from_time           to_time             id_device
------------------------------------------------------------
OK      2017-01-01 00:00:00 2017-01-01 00:01:00 1
Failed  2017-01-01 00:01:00 2017-01-01 00:04:00 1
OK      2017-01-01 00:04:00 NOW                 1
OK      2017-01-01 00:00:00 NOW                 2
OK      2017-01-01 00:00:00 NOW                 3


 类似资料:
  • 我正在做一个游戏,但是我在使用“相交”功能时遇到了一个问题。塞纳里奥看起来像这样;我做了一个游戏,玩家是一个长方形,目标是杀死敌人。敌人的“老板”矩形有两个“模拟”,模拟一个运动和一个攻击。这些模拟是由向量驱动的。移动是水平来回的,攻击是垂直的,一种冲锋式的交易。boss也有一个矩形的目标区域,如果被截断,“boss”将在屏幕上冲锋。现在问题来了,当我试图让它,如果球员与矩形目标区域相交,“老板”

  • 问题内容: 我有一个类似于以下内容的插入语句: 我需要使用多个ID插入同一条语句。现在我有: 我只是必须运行此程序,还是有一个更精简的版本? 问题答案: 使用:

  • 下面是我的wiremock存根映射: 因此,当客户端使用url模式=/api/myApp执行http请求时,WireMock返回成功http状态=200。 美好的很好。 但我需要当客户端使用相同的url模式执行第二个请求时,WireMock必须返回这个存根响应: 所以: 第一个要求- 第二个同样的请求- 可以用WireMock吗?

  • 我有一个(可能很大的)列表,包含三个小的非负整数元组,比如 我想对中的元组进行排序,以便相邻的元组(和)“尽可能相似”。 定义两个三元组的不相似性为它们之间不相等的元素的数量。例如。 vs.:差异. vs.:差异. vs.:差异. vs.:差异. vs.:差异. 问题:寻找排序的好算法是什么,它可以最小化所有相邻三元组之间的差异之和? 下面是一个计算两个三元组之间差异的函数: 这里有一个函数,它计

  • 这个 邻接列表 模式是一种常见的关系模式,通过该模式,表包含对其自身的外键引用,换言之,是 自指关系 。这是在平面表格中表示分层数据的最常见方式。其他方法包括 嵌套集 ,有时称为“修改的预购”,以及 物化路径 。尽管在评估SQL查询内的流畅性时,修改的预排序很有吸引力,但由于并发性、降低复杂性的原因,邻接列表模型可能是最适合大多数分层存储需求的模式,而且与可以将子树完全加载到应用程序空间的应用程序

  • 对于单链表,交换非相邻单元格可以通过以下操作来描述,假设'= 但是,该操作不适用于交换相邻记录、创建循环链接,如X- 相邻的记录交换,假设X在Y之前,可以用一组单独的操作来描述: 我似乎无法将这组操作作为前一组或父组的常见子集来解决。 是否有一套统一的、无条件的操作来描述对相邻和非相邻记录都有效的交换?