【发布时间】:2012-10-27 14:20:05
【问题描述】:
数据库设计远非最佳,但我必须处理它,现在我真的陷入困境。
编辑:我正在使用cx_Oracle
好的,这是我的查询:
query="select degree, spectraldev.event.eventnumber \
from spectraldev.degree \
join spectraldev.alignment on \
(spectraldev.version_id = alignment.version_id) \
join spectraldev.event on \
(alignment.timestamp between event.eventstart and event.eventstop) \
join spectraldev.eventsetup on \
(spectraldev.event.eventsetup = spectraldev.eventsetup.oid) \
where spectraldev.event.eventnumber>=" + options.start + " AND spectraldev.event.eventnumber<=" + options.stop + " AND \
HITS>=" + str(options.minimum_hits)+" \
order by spectraldev.event.eventnumber"
db_cursor.execute(query)
它会为许多事件返回一堆 degrees(12.34 等),这些事件由唯一编号标识(eventnumber,如 346554)。
所以我得到一个这样的表:
454544 45.2
454544 12.56
454544 41.1
454544 45.4
454600 22.3
454600 24.13
454600 21.32
454600 22.53
454600 54.51
454600 33.87
454610 32.7
454610 12.99
等等……
现在我需要为每个事件创建一个具有平均度数的字典(将所有相应的浮点数相加并除以它们的数量)。
我认为这可以在 SQL 中完成,但我无法让它工作。目前我正在使用 python 来执行此操作,但是 fetch 命令需要 1-2 小时才能完成大约 2000 个事件,这太慢了,因为我需要处理大约 1000000 个事件。
这是我的抓取部分,需要很长时间:
_degrees = []
for degree, eventNumber in cursor.fetchall():
_degrees.append([eventNumber, degree])
然后排序(非常快,
_d={}
for eventNumber, degree in _degrees:
_d.setdefault(eventNumber, []).append(degree)
for event in events:
_curDegree = _degrees[int(event)]
_meanDegree = sum(_curDegree) / float(len(_curDegree))
meanDegrees.append(_meanDegree)
有没有办法在 SQL 中做 python 部分?
【问题讨论】:
标签: python oracle query-optimization cx-oracle fetchall