在我们的现有系统中,我们有一个表来存储报告的用户信息(让我们说UserInfoRaw),这个表只包含1个字段(详细信息),样本数据将如下所示:
^StartNewUser
^UserName
Simon
^EnableFacebook
Y
^EnableTwitter
N
^EndNewUser
^StartNewUser
^UserName
Vicky
^EnableFacebook
N
^EndNewUser
目前,我们需要将此格式转换为可查询的表格,例如"用户信息"其中包含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:生成包含^ StartNewUser / ^ UserName
的行映射的JOIN12 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团队我指的是什么......真是一团糟......)
答案 0 :(得分:-1)
您自己承认,您有一个文本文件,而不是表格。
SQL不是为处理文件(文本或其他文件)而设计的,它旨在处理包含表和关系的数据库。
因此,不要为此使用SQL语句,将其作为文本文件处理。它会变得更快更简单。我的默认假设是,执行from textwrap import dedent
from statistics import mean
def return_average(d):
return 0.1 * mean(d['homework']) + 0.3 * mean(d['quizzes']) + 0.6 * mean(d['tests'])
def get_average(ar):
# Create a list with all names
# The whitespace will be removed with dedent
namestring = '\n'.join([' {}. {}'.format(idx, i['name'])
for idx,i in enumerate(ar,1)])
# Ask for a valid input
while True:
student = input(dedent('''\
Please type the number of the student who's\
weighted average you would like to see:\n{}\n'''.format(namestring)))
if student in map(str,range(1,len(ar))):
break
else:
print("Not valid input")
# Send the valid input to return_average function
print(return_average(data[int(student)]))
get_average(data)
的传统RPGLE程序将击败在SQL中进行此类处理的任何尝试,因为这是它为其设计的工作负载类型。或者使用任何其他可以处理文件的语言。
(在SQL中使用存储过程并启动光标会更容易,但它最好是笨重的,因为SQL缺少许多功能,因此在正常情况下执行此操作&#39 ;编程语言如此简单,如本地,私有函数)
我有一把锤子,用什么方法将它切成两半?