2015-04-06 232 views
2

我有以下查詢,我將打電話QUERY1:Netezza公司SQL For循環

with a as (
select customer_key as cust, 
sum(sales)*1.0/4 as avg_sales 
sum(returns)*1.0/4 as avg_return 
count(distinct order_key)*1.04 as avg_num_orders 
from orders_table 
where purch_year between 2011 and 2014 
group by cust 
order by random() 
), 

b as (
select * 
from a 
where avg_num_orders > .25 
limit 100000 
) 

select case 
     when avg_num_orders <= 1 then 'Low' 
     when avg_num_orders between 1 and 4 then 'Medium' 
     when avg_num_orders > 4 then 'High' 
    end as estimated_frequency, 
    count(cust) as num_purchasers_year, 
    sum(avg_num_orders) as num_orders_year, 
    avg(avg_num_orders) as avg_num_order_year, 
    sum(avg_sales) as avg_sales_year, 
    sum(avg_total_return) as avg_return_year, 
    avg_sales_year/num_orders_year as AOV, 
    avg_sales_year/num_purchasers_year as ACS, 
    stddev(avg_sales) as sales_stddev 
from b 
where avg_num_orders > .25 
group by estimated_frequency 
order by estimated_frequency; 

我想要寫代碼,做以下(這是不行的,我所提供的僞代碼)。我無權創建程序。

Create table temp1 
for i in 1..100 loop 
insert into temp1 the result of QUERY1 
end loop 

然後

select estimated_frequency, 
     avg(acs), 
     avg(sales_stddev) 
from temp1 
group by estimated_frequency 

從本質上講,我想運行QUERY1 100次,並將結果存儲在一個名爲temp1中的表,然後計算在temp1中有一些平均數,一旦我感到一切都成定局。

謝謝您的幫助

回答

1

我會加入這個作爲註釋,但沒有足夠的代表。

我能看到的唯一的選擇就是做這個Netezza公司外部的,並且一個批處理文件/ shell腳本/ Python腳本寫你的循環/ ...

我嘗試以下,但請注意,這並不因爲隨機數只生成一次然後重新使用,所以你得到100個相同的樣本。

-- Test view which gives some random data from an existing table. 
create view my_view as 
    select 
     m.* 
    from my_table t 
    join (
     select (floor(random()*10)+1)::integer rand_id -- assuming I have ids from 1 to 10 
    ) x on x.rand_id = t.id; 

create table results (id integer, data double precision); 

insert into results 
    select v.* 
    from my_view v 
    cross join table(generate_series(1,100)); 

Generate_series是用戶定義的表函數,你可以從the Enzee Community website得到。