我没有删除此问题,因为坦率地说,这是一个不同的问题。我提出的第一个问题集中在对观点的含义(是否有什么意义),以及它是否会做我想的是什么。这是一个特定的问题,我们有一个特定表。
没有示例表很难解释。我们有一个表可以处理具有以下列的单元上的更新列表(示例我不确定我可以提供多少特定信息,但这应该涵盖案例):( 我们正在运行系统i7.1 )
unit#, (this is not an actual number, it's a character column, not all units are numeric)
timestamp,
(other stuff that doesn't matter for this)
该表的设计有很多问题:
- 单元#不是唯一的。实际上,该表上根本没有索引。该表上根本没有唯一的列。
- 的唯一列是时间戳。这是一个字符类型的列,具有以下格式的时间戳:2015-05-05-15.27.30.748000
- 表本身是> 10GB,大小> 35m条目。
- 该桌子每15分钟到一个小时的更新一次,每次有1-400个来源的任何地方。对我而言,这使得时间戳场不那么独特,而更多的单位则是重复的机会。到目前为止,还没有,但是似乎没有前20m行已经填充了,所以我猜这是软件创建者的后期添加。
问题之一是我们无法控制软件代码,也无法维护软件本身。因此,当该列进行更新时可能会删除或冲突时,我们不舒服地添加新列(例如:针对每行索引的独特索引列的某些列)。
。我们需要此表中的所有行(尽管我要询问我们在其他地方进行转储和备份的可能性,也许还有另一个表格在它们太老之后将其滚入的表。)
现在,我需要做的是能够创建一个视图,该视图在此处抓取每个单元的最新行。因此:
(为了保持简单,我要制作时间戳,仅从100起的数字)
u1,100
u3,103
u1,105
u2,110
u4,111
u1,115
我需要视图包含:
u3,103
u2,110
u4,111
u1,115
并删除每个GO的先前条目(因此,如果U4更新为118,则U4,111将消失)
我不打算听起来像是"嘿为我做的",但是我一直在尝试各种事情,并阅读各种帖子/博客/文档。如果您有指导我可以看的方向,请随意链接,从一开始我会很乐意进行研究!
谢谢,希望我(在这一点上对我)解释了这一点,大声笑。
编辑:固定在示例内容上的格式。编辑:也可以忽略任何没有时间戳的行。
您需要弄清楚如何使用那些空的时间戳值,否则答案看起来像
create view v1 as
select unit#, ts from (
select unit#, ts, row_number() over (partition by unit# order by ts desc) rn
) t where rn = 1
我无法访问系统,所以我无法测试它,但是它很简单,所以我认为它应该起作用。
不确定我是如何错过的;我回应了对方。无论如何,注意到这个没有接受的答案,我认为我会回答希望能够快速而轻松地获取数据的一种方法,因为OP正在寻找"更多的选项",显然[静止]的"慢速"结果。<<<<<<<<<<<<<</p>
出于OP的目的,使用[老式] Max聚合应与OLAP查询一样好。也许这甚至更好,鉴于OLAP查询将趋于[甚至需要]暂时的结果,因此表达的数据更改结果不会像预期的那样动态。即,对于不再是最大的值表示的值,对于" 删除先前的条目"表示的" 删除先前的条目"所需的效果表示为" "或最新的根据时间戳样列。
由以下创建索引创建的键入访问路径(ACCPTH)[用于OP中所述的大量数据时]将启用某种 Quick Quick 访问对一个由A的数据访问的数据查询以下创建视图创建的视图。这是通过在索引中使用键选择的所有空白 timestamp 值来实现的,并通过 index-forly 访问数据启用了查询实现;同样,查询应是该索引之后创建的视图,因为这确保了封装查询与选择性索引的一致性。注意: timestamp 缺乏DDL,以及先前主题中的描述在AS400 db2中创建视图,暗示时间戳数据实际上存储在两列中,而该术语null中的null一词答案是在没有任何校正/建议的情况下进行评论的,这意味着在本文中做出的假设可能不正确,因此可能需要调整 - 这是困难,当OP不提供实际的实际DDL:
create index so30061994_xut
on SO30061994 ( unit#, ts )
where ts <> '' /* OP says that *blank* records unneeded */
;
create view so30061994_grp as
select unit#, max( ts ) as ts
from so30061994
/* create table so30061994 ( unit# char(x), ts char(26) ) */
where ts <> '' /* must match the predicate in the INDEX */
group by unit#
;
select *
from so30061994_grp
where unit# between 'U1' and 'U4'
; -- likeness of report from above query
U1 115
U2 110
U3 103
U4 111