在我们现有的系统中,我们有一个表来存储报告的用户信息(比如UserInfo Raw),这个表只包含1个字段(详细信息),样本数据如下所示:
^StartNewUser
^UserName
Simon
^EnableFacebook
Y
^EnableTwitter
N
^EndNewUser
^StartNewUser
^UserName
Vicky
^EnableFacebook
N
^EndNewUser
目前我们需要将此格式转换为可查询的表,让我们说“User-info”包含3个以下的字段,输出应该是
UserName facebook twitter
==================================================
Simon Y N
Vicky N N
约束是
1.我知道我需要提取的tage字段(说,^EnableFacebook
是我知道的标签名称,可用于选择)
2.我们按用户级别提取,对于每个用户,他们必须在txt中有^StartNewUser/^EndNewUser
,这是预先假设的。
3.对于某些情况(例如,Vicky's ^EnableTwitter
标签),属性标签可能不存在,它应该在提取时将此字段视为N.
4.我们只能在这里使用纯SQL,因为这是我们MI团队的临时解决方案,他们只能运行SQL,目前我们无法执行任何程序发布以自动执行此过程。
目前我们已经提出了RRN的解决方案,但需要许多临时表
1:产生OUT1,其包括每个用户的开始/结束的行号
SELECT RRN(A) ,detail from UserInfoRaw A where A.detail in ('^StartNewUser' , '^EndNewUser')
1 ^StartNewUser
8 ^EndNewUser
9 ^StartNewUser
14 ^EndNewUser
2:生成OUT2,其中包括用户名的行号
Select RRN(A) ,detail from UserInfoRaw A where RRN(A) IN
(select RRN(B)+1 from UserInfoRaw B where B.detail = '^UserName')
3 Simon
11 Vicky
3:生成JOIN12,其中包括^ StartNewUser / ^ UserName的行映射
Select MAX(A.row) as startRow , B.row as nameRow from OUT1 A,OUT2 B
where A.detail = '^StartNewUser' AND A.row <B.row
GROUP BY B.row
order by A.row
1 3
9 11
4:通过^ startNewUser的行加入3表以获得1字段映射
Select C.startRow ,A.detail , C.nameRow,B.detail from OUT1 A, OUT2 B, JOIN12 C where A.row=C.startRow and B.row=C.nameRow
1 ^startNewUser 3 Simon
9 ^startNewUser 11 Vicky
通过这种方法,我们可以生成1个字段映射,并且使用类似的步骤,我们可以得到我们想要的所有结果字段表。
但我们有10多个字段需要提取(如果业务请求,我们可以提供更多字段),因此我们在这里寻求帮助,看看我们是否对此案例有更好的了解。谢谢!
(ps:如果你是AS400的家伙而且你知道如何通过wrkqry产生最好的结果:)你知道MI团队我指的是什么......真的很糟糕..)
你自己承认,你有一个文本文件,而不是一个表。
SQL不是为处理文件(文本或其他)而设计的,它旨在处理包含表和关系的数据库。
因此,不要为此使用SQL语句,将其作为文本文件处理。它会更快更简单。我的默认假设是,执行READ
的传统RPGLE程序将击败在SQL中进行此类处理的任何尝试,仅仅因为这是它为其设计的工作负载类型。或者使用任何其他可以处理文件的语言。
(在SQL中使用存储过程并启动游标会更容易,但它最好是不实用的,因为SQL缺少许多功能,因此使用'普通'编程语言这样做更容易,比如本地,私人活动)
我有一把锤子,使用它将板子切成两半的最佳方法是什么?