数据库设计远非最佳,但我必须处理它,现在我真的被困住了。
编辑:我正在使用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)
它为许多事件返回一堆degree
s (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
等等……</p>
现在我需要创建一个字典,其中包含每个事件的平均度数(将所有相应的浮点数相加并除以它们的数量)。
我认为这可以在 SQL 中完成,但我无法让它工作。目前我正在使用 python 来执行此操作,但是 fetch 命令需要 1-2 小时才能完成大约 2000 个事件,这太慢了,因为我需要处理大约 1000000 个事件。
这是我的获取部分,需要很长时间:
_degrees = []
for degree, eventNumber in cursor.fetchall():
_degrees.append([eventNumber, degree])
然后排序(非常快,< 1 秒)并计算平均值(也非常快):
_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 部分?