Sql 如何仅选择2条记录在另一条记录之后

Sql 如何仅选择2条记录在另一条记录之后,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我甚至不知道如何问这个问题,但我将在示例中展示我试图实现的目标 ID NAME ACTIVITY TIMESTAMP 1 .. book timestamp 1 .. eat timestamp 1 .. sleep timestamp 2 .. apple timestamp 2 .. eat timestamp 2 .. s

我甚至不知道如何问这个问题,但我将在示例中展示我试图实现的目标

 ID  NAME   ACTIVITY  TIMESTAMP
 1    ..      book      timestamp
 1    ..      eat       timestamp
 1    ..      sleep     timestamp

 2    ..      apple     timestamp
 2    ..      eat       timestamp
 2    ..      sleep     timestamp
 2    ..      book      timestamp

 3    ..      eat       timestamp
 3    ..      sleep     timestamp
 3    ..      book      timestamp
 3    ..      sleep     timestamp

 4    ..      eat       timestamp1
 4    ..      sleep     timestamp1
 4    ..      sleep     timestamp2
 4    ..      eat       timestamp2
仅当
eat
之后的下一条记录是
sleep
并且它们都具有相同的
时间戳和
ID

因此,产出将是巨大的。对于本例,它们都具有相同的时间戳。当
ID
=
4
发生两次,但时间戳不同

 ID  NAME   ACTIVITY  TIMESTAMP

 1    ..      eat        timestamp
 1    ..      sleep      timestamp

 2    ..      eat        timestamp
 2    ..      sleep      timestamp

 3    ..      eat        timestamp
 3    ..      sleep      timestamp

 4    ..      eat        timestamp1
 4    ..      sleep      timestamp1
 4    ..      sleep      timestamp2
 4    ..      eat        timestamp2
分析和功能将实现以下功能:

SELECT ID, Name, Activity, Timestamp
FROM (
  SELECT
    ID,
    Name,
    Activity,
    Timestamp,
    LAG(Activity) OVER (PARTITION BY ID, Timestamp ORDER BY Activity) AS PriorActivity,
    LEAD(Activity) OVER (PARTITION BY ID, Timestamp ORDER BY Activity) AS NextActivity
  FROM Activity
  WHERE Activity IN ('eat', 'sleep')
)
WHERE (Activity = 'eat' and NextActivity = 'sleep')
   OR (Activity = 'sleep' AND PriorActivity = 'eat')
内部查询排除任何不是
eat
sleep
的活动,并捕获
ID
Timestamp
的先前(
LAG
)和下一个(
LEAD
)活动,按活动名称排序,这恰好适合
eat
sleep
之前排序

外部查询只是确保
eat
后面跟着
sleep
sleep
前面跟着
eat
。由于内部查询的分区,只有在相同的
ID
Timestamp
下才能找到这两种类型

 ID  NAME   ACTIVITY  TIMESTAMP

 1    ..      eat        timestamp
 1    ..      sleep      timestamp

 2    ..      eat        timestamp
 2    ..      sleep      timestamp

 3    ..      eat        timestamp
 3    ..      sleep      timestamp

 4    ..      eat        timestamp1
 4    ..      sleep      timestamp1
 4    ..      sleep      timestamp2
 4    ..      eat        timestamp2

如果您对查询有任何疑问,请尝试单独运行内部查询-这将显示由外部查询过滤的原始数据。

非常感谢您的工作,但当我运行整个查询时,我没有选择任何行,而当我只运行内部查询时,我会获得大量数据,我知道很多时候,睡眠和进食的时间戳在很多ID中都是相同的。请注意,在PriorActivity和Nextactivity中,我没有在同一行看到
睡眠
进食
,它在下一行。嗨@Mowgli,我一定误解了你的数据,那么,如果您的数据与我的测试数据看起来不同,您可以检查并让我知道吗?一旦我对数据有了更好的处理,我相信我们可以让它工作。嗨@Mowgli-我知道了。我上面的答案取决于
之前的字母顺序。你的实际数据正好相反。在外部查询
WHERE
子句:
WHERE(事件类型='ETR\u CHANGE'和优先级='CREW\u ETR\u COMMENT\u CHANGE')或(事件类型='CREW\u ETR\u COMMENT\u CHANGE'和NextActivity='ETR\u CHANGE')
。这对我很有用。嗨@Mowgli,我想我知道了。这并没有根本的不同,但肯定有一些变化。新查询中有一个SQL错误。还有一些注释行解释了这些更改。不幸的是,我的一天变得越来越复杂,所以从现在起大约15分钟我就不在了。请尝试新的查询。它对以前的数据有效,加上你的两个新条目,但除此之外我还没有测试过它。如果有任何问题,请告诉我,我明天再看。