利用Oracle g的 MODEL SQL进行行间计算
以产品产量表为例一个工厂(用code表示)生产多种产品(用p_id表示)每种产品具有生产量(v)和销售量(v)
产品代码具有审核关系比如=+其中代表大类和代表大类下的小类
SQL>createtablet(codevarchar()p_idvarchar()vnumber()vnumber());
Tablecreated
SQL>insertintotvalues();
SQL>insertintotvalues();
SQL>insertintotvalues();
SQL>insertintotvalues();
SQL>insertintotvalues();
SQL>insertintotvalues();
SQL>commit;
Commitcomplete
SQL>select*fromt;
CODEP_IDVV
rowsselected
SELECTcode
p_idv
FROMt
WHEREcodeIN()
MODELRETURNUPDATEDROWS
PARTITIONBY(code)
DIMENSIONBY(p_id)
MEASURES(v)
RULES(
v[err]=v[]+v[]v[])
ORDERBYcodep_id;
其中rule表示计算规则err表示这条审核关系的代号它的值等于P_ID为的v值+P_ID为的v值P_ID为的v值
PARTITION BY (code)表示按工厂分区即审核在一个工厂内的产品
MODEL 关键字后面的 RETURN UPDATED ROWS 子句将结果限制为在该查询中创建或更新的那些行使用该子句是使结果集只包含新计算的值在本例中就是审核结果
CODEP_IDV
err
err
如果返回值=表示v[] + v[] =v[]审核通过否则审核不通过
SELECTcode
p_idvv
FROMt
WHEREcodeIN()
MODELRETURNUPDATEDROWS
PARTITIONBY(code)
DIMENSIONBY(p_id)
MEASURES(vv)
RULES(
v[err]=v[]+v[]v[]
v[err]=v[]+v[]v[])
ORDERBYcodep_id;
CODEP_IDVV
err
err
如果表格中包含多个维度的数据比如时间多个维度都可以编写规则比如年的审核关系
SELECTyearcode
p_idv
FROMt_
WHEREcodeIN()
MODELRETURNUPDATEDROWS
PARTITIONBY(code)
DIMENSIONBY(p_idyear)
MEASURES(v)
RULES(
v[err]=v[]+v[]v[])
ORDERBYcodep_id;
YEARCODEP_IDV
err
err
如果维度不影响规则也可以只分区而沿用原来的规则
SELECTyearcode
p_idv
FROMt_
WHEREcodeIN()
MODELRETURNUPDATEDROWS
PARTITIONBY(codeyear)
DIMENSIONBY(p_id)
MEASURES(v)
RULES(
v[err]=v[]+v[]v[])
ORDERBYcodep_id;
YEARCODEP_IDV
err
err
SQL>createtablet_asselect*fromt_;
Tablecreated
SQL>insertintot_selectyearcodep_idvvfromt_;
rowscreated
如果表中具有多个年份的数据每个年份的审核结果都能显示
SELECTyearcode
p_idv
FROMt_
WHEREcodeIN()
MODELRETURNUPDATEDROWS
PARTITIONBY(codeyear)
DIMENSIONBY(p_id)
MEASURES(v)
RULES(
v[err]=v[]+v[]v[])
ORDERBYcodep_id;
YEARCODEP_IDV
err
err
err
err