基于IBM I(as/400)中DB2中的单位号,使用每个记录的最后一个记录创建视图



我没有删除此问题,因为坦率地说,这是一个不同的问题。我提出的第一个问题集中在对观点的含义(是否有什么意义),以及它是否会做我想的是什么。这是一个特定的问题,我们有一个特定表。

没有示例表很难解释。我们有一个表可以处理具有以下列的单元上的更新列表(示例我不确定我可以提供多少特定信息,但这应该涵盖案例):( 我们正在运行系统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

相关内容

  • 没有找到相关文章

最新更新