Oracle SQL:操作组

时间:2017-06-08 13:42:17

标签: sql oracle

我有一个简单的查询,比如这个

select duration, host from Jobs
group by host;

我希望它实际上由一个主机池分组,这是需要在查询时定义的东西

例如,host01-10将是pool1,host11-20将是pool2等等。

目前,没有一个字段说明它所在的池,但它需要从主机字段派生。

我如何实现这一目标?我希望能够在幻灯片上创建某种功能,以便对该字段进行操作,以便它可以分组

def get_pool(host):
   if get_hostnumber(host) < 10:
        return 'pool1'
    elif:
        ...

select duration, get_pool(host) from Jobs
group by get_pool(host);

2 个答案:

答案 0 :(得分:1)

在SQL中,您不需要为此功能。我建议只使用case表达式:

select (case when host <= 'host10' then 'pool1'
             when host <= 'host20' then 'pool2'
             . . .
        end) as hostgrp, sum(duration) as duration
from jobs
group by (case when host <= 'host10' then 'pool1'
             when host <= 'host20' then 'pool2'
             . . .
        end);

对于您的特定示例,您可以逃脱:

select 'pool' || floor( (cast(substr(host, 5, 6) as number) + 1) / 10),
       sum(duration) as duration
from jobs
group by 'pool' || floor( (cast(substr(host, 5, 6) as number) + 1) / 10);

而且,为了忘记,我在主机及其组之间有永久映射,那么您应该在数据库中放置一个hosts引用表,并为该组添加第二列。然后,此查询将只使用join,您编写的任何其他查询都将具有相同的信息。

答案 1 :(得分:1)

您可以在选择和分组中使用案例:

fitfuncvx = lambda p, x: p[2]+p[0]*np.exp(-x/p[1])
errfuncvx = lambda p, x, y: y - fitfuncvx(p, x)
sig_fit=np.where(Sig<12)
pinit = [1, 100,0.1]
pfinal, success = optimize.leastsq(errfuncvx, pinit[:], args=(Sig[sig_fit], vx[sig_fit]))