如何解决只汇总并发行
我正在尝试汇总并发行
Tool State Duration Start_DT End_Dt
ToolA Enabled 10 09:00 09:10
ToolA Idle 5 09:10 09:15
ToolA Enabled 10 09:15 09:25
ToolA Enabled 15 09:25 09:40
ToolA Disable 7 09:40 09:47
ToolA Enabled 3 09:47 09:50
ToolA Enabled 5 09:50 09:55
ToolA Enabled 10 09:55 10:05
ToolB Idle 2 09:00 09:02
ToolB Idle 7 09:02 09:09
ToolB Disabled 10 09:09 09:19
将成为
Tool State Duration Start_DT End_Dt
ToolA Enabled 10 09:00 09:10
ToolA Idle 5 09:10 09:15
ToolA Enabled 25 09:15 09:40
ToolA Disable 7 09:40 09:47
ToolA Enabled 18 09:47 10:05
ToolB Idle 9 09:00 09:09
ToolB Disabled 10 09:09 09:19
所有这些都来自一张桌子。 我使用过函数来确定行状态何时匹配上一行或下一行。 我想我需要某种标识符来汇总这些标识符。 我当时在想一个累加的总和,但看不到如何只保留那些匹配的行。 当row_match = 0时,我可以在总和中添加一个子句来停止吗? 任何帮助表示赞赏。
select Tool,State,duration,start_dt,case when state = lead(state) over (partition by tool order by start_dt)
or state = lead(state) over (partition by tool order by start_dt)
then 1 else 0 end row_match
from tbl_tool_state_times;
解决方法
这是一种空白和岛屿问题。我建议行号和聚合的区别:
select tool,state,sum(duration),min(start_dt),max(end_dt)
from (select t.*,row_number() over (partition by tool order by start_dt) as seqnum,row_number() over (partition by tool,state order by start_dt) as seqnum_2
from t
) t
group by tool,(seqnum - seqnum_2);
注意:这假设记录时间没有间隔。该假设与您的样本数据完全一致。
这是如何工作的,很难解释。但是,如果您查看子查询的结果,则会看到行号之间的差异如何识别状态相同的相邻行。
,我了解您不在12c上,但也许将来您可以在Oracle 12c上使用match_recognise实现它:
SELECT TOOL,STATE,SUM(DURATION),MIN(START_DT) START_DT,MAX(END_DT) END_DT FROM (
select * from Table_match_recognize
match_recognize (
partition by tool order by Start_DT
measures
match_number() as mno,classifier() as cls
all rows per match
pattern ( dont_match* MATCH1* dont_match*)
define
MATCH1 as STATE = next(STATE) or state = prev(state),DONT_MATCH as STATE <> PREV(STATE) and state <> next(state)
) MR ) GROUP BY TOOL,MNO,CLS ORDER BY TOOL,START_DT;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。