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分钟我就不在了。请尝试新的查询。它对以前的数据有效,加上你的两个新条目,但除此之外我还没有测试过它。如果有任何问题,请告诉我,我明天再看。