-1

我有一个这样定义的表:

CREATE TABLE event (t REAL, event TEXT, value);

对于表中具有event='type'和的每条记录,value='G'将有两条对应的记录与event='Z'- 一条与value=1,一条与value=0。这是一个例子:

t              |  event    |  value
1624838448.123 |   type    |    G
1624838448.123 |    Z      |    1
1624839543.215 |    Z      |    0

请注意,可能有其他event='Z'记录没有相应的type='G'记录。我正在尝试编写一个查询来查找所有具有相应记录的记录event='G'以用作附加查询(或连接?)的边界。type='G'

注意:“type”事件的 t 值和 value=1 的 Z 事件将始终相同。

例如,如果表格看起来像这样:

t              |  event    |  value
1624838448.123 |   type    |    G
1624838448.123 |    Z      |    1
1624839543.215 |    Z      |    0
1624839555.555 |   type    |    H
1624838555.555 |    Z      |    1
1624839602.487 |    Z      |    0
1624839999.385 |   type    |    G
1624839999.385 |    Z      |    1
1624840141.006 |    Z      |    0

然后我希望查询的结果返回这个:

t1             |       t2
1624838448.123 | 1624839543.215
1624839999.385 | 1624840141.006 
4

2 回答 2

0

从您的评论中:

按时间顺序总是有三个记录(忽略中间的任何其他事件):“类型”事件,第一个具有相同时间戳的“Z”记录,以及第二个具有较晚时间戳的“Z”记录

因此,不需要t1单独返回,因为它等于twhereevent = 'type'和的行value = 'G'

因为t2您可以将条件聚合与MIN()窗口函数一起使用:

SELECT t1, t2 
FROM ( 
  SELECT t AS t1, event, value
         MIN(CASE WHEN event = 'Z' AND value = '0' THEN t END) OVER (ORDER BY t ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) t2
  FROM Event
)
WHERE event = 'type' AND value = 'G'

请参阅演示

于 2021-08-30T18:13:20.847 回答
-1

我找到了使用 RANK() 函数的解决方案。有了这个,我得到了一个中间表,它对于“类型”和第一个“Z”记录具有相同的等级,因为它们具有相同的时间戳,并且第二个“Z”记录的等级高两个。我使用WITH这样我就可以重复地自我加入,而不必一遍又一遍地指定相同的查询。我首先通过要求两个第二个记录的类型大于第一个记录的类型来加入“type”和第一个“Z”行(所以我只得到 type:Z 组合而不是 type:type、Z:type 或Z Z)。然后我再次自我加入以获得获得第二条 Z 记录的 rank-2 行。总体而言,查询如下所示:

WITH Seq(t,event,A,I)
AS
(
    SELECT t, event, value,
           RANK() OVER (ORDER BY t) I
    FROM Event e1
    WHERE (e1.event='type' OR e1.event='Z')
)
SELECT s2.t,s3.t
FROM Seq s1
INNER JOIN Seq s2 ON s1.I = s2.I AND s1.event < s2.event
INNER JOIN Seq s3 ON s1.I = s3.I-2
WHERE s1.value='G';
于 2021-08-30T16:01:57.480 回答