【发布时间】:2009-12-28 21:50:08
【问题描述】:
我在 Oracle 10 中有一个表,其定义如下:
LOCATION HOUR STATUS
--------------------------------------
10 12/10/09 5:00PM 1
10 12/10/09 6:00PM 1
10 12/10/09 7:00PM 2
10 12/10/09 8:00PM 1
10 12/10/09 9:00PM 3
10 12/10/09 10:00PM 3
10 12/10/09 11:00PM 3
此表适用于不同的位置和少量的状态值。每行涵盖一个位置的一小时。在该小时内从特定位置收集数据,并以块的形式进行处理。有时数据可用,有时不可用,并且该信息被编码在状态中。我正在尝试查找特定状态的运行,以便可以将上表转换为以下内容:
LOCATION STATUS START END
-----------------------------------------------------------
10 1 12/10/09 5:00PM 12/10/09 7:00PM
10 2 12/10/09 7:00PM 12/10/09 8:00PM
10 1 12/10/09 8:00PM 12/10/09 9:00PM
10 3 12/10/09 9:00PM 12/11/09 12:00AM
基本上将表格压缩为定义特定状态的每个延伸的行。我尝试了各种技巧,例如使用领先/滞后来确定开始和结束的位置等等,但所有这些都遇到了失败。到目前为止,唯一有效的技巧是以编程方式逐个遍历值,这很慢。有什么直接在 Oracle 中做的想法吗?谢谢!
【问题讨论】:
-
这是一个设计不佳的数据库的完美示例。如果重新设计架构不是您的选择,为了获得一些帮助,您必须解释状态代码之间的关系 - 您的问题不是很清楚。
-
@Miky D,你能解释一下为什么它设计得不好而不是说它是?
-
结果表中最后一行的规则是什么?那个有一个状态 3 的开始和结束日期时间,而前三行的开始日期时间对应于状态列中的状态,但结束数据时间对应于下一个间隔的状态。
-
架构可以重新设计,但是以什么方式?该表的主要用途是作为一个进程的记分牌,用于标记它在哪些位置工作的时间。当每个处理步骤对该小时的数据进行时,状态每小时都会发生变化。
-
@Roland 哎呀,应该是 12/11/09 12:00AM。让我解决这个问题。
标签: sql oracle datetime analytics