0

我在 python 脚本中运行这样的查询

results = []
for day in days:
    for hour in hours:
        for id in ids:
             query = "SELECT AVG(weight) from table WHERE date >= '%s' \
                                                          AND day=%s \
                                                          AND hour=%s AND id=%s" % \
                     (paststr, day, hour, _id)
             results.append(query.exec_and_fetch())

或者对于不习惯 python 的人,对于每一天,对于那天的每一个小时,对于每个小时列表中的所有 id,我需要获取某些项目的平均重量。

举个例子:

day 0 hour 0 id 0
day 0 hour 0 id 1
...
day 2 hour 5 id 4
day 2 hour 6 id 0
...

这会导致很多查询,所以我在考虑是否可以在一个查询中执行此操作。我一直在摆弄视图,但我总是卡在不断变化的参数上,或者它们变得非常非常慢,这是一张相当大的桌子。

我最接近的猜测是:

create or replace view testavg as 
       select date, day, hour, id, (select avg(weight) from cuWeight w_i 
                                        where w_i.date=w_o.date 
                                           and w_i.day=w_o.day 
                                           and w_i.hour=w_o.hour) 
       from cuWeight w_o;

但这还没有返回任何东西,等了一两分钟后我取消了查询。

表如下所示:

CREATE TABLE `cuWeight` (
  `id` int(11) NOT NULL default '0',
  `date` date default NULL,
  `hour` int(11) default '0',
  `weight` float default '0',
  `day` int(11) default '0',
  KEY `id_index` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

myisam 和 latin1 是出于历史(几乎是化石)的原因。

4

1 回答 1

0

你需要一个GROUP BY查询

select date, day, hour, id, avg(weight)
   from cuWeight
   where date > *some date*
group by date, day, hour, id ;

如果它仍然很慢,您可以将其分成几块,例如:

for day in days:
    query = "select date, day, hour, id, avg(weight) \
                from cuWeight \
                where date > '%s' \
                  and day = %s \
                group by date, day, hour, id " % \
            (paststr, day)
...
于 2013-08-23T10:01:28.623 回答