Ibm midrange 在DB2forIBMi(AS/400)中基于单元号创建每个记录的最后一个视图

Ibm midrange 在DB2forIBMi(AS/400)中基于单元号创建每个记录的最后一个视图,ibm-midrange,db2-400,Ibm Midrange,Db2 400,我取消了删除,因为坦率地说,这是一个不同的问题。我问的第一个问题集中在提出一个观点的含义(如果有的话)是什么,以及它是否会像我想的那样。这是一个特定的问题,我们有一个特定的表。 如果没有示例表,这一点很难解释。我们有一个表格,用于处理具有以下列的单元更新列表(示例,因为我不确定我能给出多少具体信息,但这应该涵盖该情况):(我们正在运行system I 7.1) 该表的设计有许多问题: 这个单位不是唯一的。事实上,这个表上根本没有索引。此表上根本没有唯一的列 唯一可能被认为是唯一的列是时间戳。它

我取消了删除,因为坦率地说,这是一个不同的问题。我问的第一个问题集中在提出一个观点的含义(如果有的话)是什么,以及它是否会像我想的那样。这是一个特定的问题,我们有一个特定的表。

如果没有示例表,这一点很难解释。我们有一个表格,用于处理具有以下列的单元更新列表(示例,因为我不确定我能给出多少具体信息,但这应该涵盖该情况):(我们正在运行system I 7.1

该表的设计有许多问题:

  • 这个单位不是唯一的。事实上,这个表上根本没有索引。此表上根本没有唯一的列
  • 唯一可能被认为是唯一的列是时间戳。它是一个字符类型列,包含格式为2015-05-05-15.27.30.748000的时间戳
  • 表格本身的大小大于10GB,条目数大于35m
  • 该表每15分钟到一小时由1-400个来源的任何地方更新一次,并且不断增长。对我来说,这使得时间戳字段不那么独特,因为单位越多,重复的机会就越大。到目前为止还没有,但前2000万行似乎没有填写这个,所以我猜这是软件创建者后来添加的
其中一个问题是,我们无法控制软件代码,也无法维护软件本身。因此,在数据库中添加新列(例如:某个列对应于唯一的每行索引列)时,如果该列可能被删除或与更新时的列冲突,我们会感到不舒服

我们需要这个表中的所有行(尽管我将询问我们是否有可能在其他地方对其进行转储和备份,可能是另一个表,它会在条目太旧后将其滚动到该表中。)

现在,我需要做的是能够创建一个视图,它进入这里,获取每个单元的最新行。例如:

(为了保持简单,我将时间戳设置为一个从100开始的数字)

U1100

U3103

U1105

U2,110

U4111

U1115

我需要该视图包含:

U3103

U2,110

U4111

U1115

并在每次go时删除以前的条目(因此,如果U4更新为118,则U4111将消失)

我不想让这听起来像是“嘿,帮我做这个”,但我已经做了大约一天半了,尝试了各种各样的事情,阅读了各种帖子/博客/文档。如果你有一个方向,让我看看,请随意链接,我会非常高兴从一开始就研究

谢谢,希望我解释了这个(在这一点上)复杂的系统lol

编辑:固定格式的示例内容。
编辑:也可以忽略任何没有时间戳的行。

您需要弄清楚如何处理这些空时间戳值,否则答案可能类似于

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

我没有访问System I的权限,因此无法测试它,但它是非常简单的SQL,因此我认为它应该可以工作。

不确定我是如何错过这一次的;我回应了另一个。无论如何,注意到这个问题没有被接受的答案,我想我会用一种很有希望的方法来回答,因为OP正在寻找“更多的选择”和明显的(仍然)缓慢的结果,从而快速、轻松地获得数据

出于OP的目的,使用[老式的]最大聚合应该与OLAP查询一样好。或者可能更好,因为OLAP查询将趋向[甚至需要]一个临时结果,这样表示的数据更改结果将不会像预期的那样动态;i、 e.根据时间戳列中不再是最大或最新条目的值的“删除以前的条目”所表达的预期效果,很难知道暗示了什么,关于如何要求效果的动态性

由以下创建索引创建的键控访问路径(ACCPTH)[当用于OP中所述的大量数据时]将允许通过以下创建视图创建的视图查询访问数据。这是通过在索引中用键选择消除所有空白时间戳值并通过索引访问数据而启用查询实现来实现的;同样,查询应该是在该索引之后创建的视图,因为这确保了封装查询与选择性索引的一致性。注:时间戳缺少DDL,先前主题中暗示时间戳数据实际存储在两列中的描述,以及回答中对术语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
创建索引so30061994\u xut
关于SO30061994(单位#,ts)
其中ts'/*OP表示不需要*空白*记录*/
;
创建视图so30061994_grp as
选择单位#,最大值(ts)作为ts
来自so30061994
/*创建表so30061994(单位#字符(x),ts字符(26))*/
其中,ts'/*必须与索引中的谓词匹配*/
按单位分组#
;
挑选*
来自so30061994_grp
其中单位#在'U1'和'U4'之间
; -- 来自上述查询的报告的相似性
U1115
U2 110
U3 103
U4 111

不要问新问题,而是考虑用扩展的信息和例子更新你原来的问题……你是什么版本的系统?你想如何处理没有时间戳的行?@查尔斯:我想
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