我有一个视图,它结合了具有这种结构的3个表的数据。
TABLE PERIOD COUNTRY CODE POSITION OCT_14 NOV_14 DEC_14
TABLE_1 Q1 UK 123 EMPL .2 .2 .2
TABLE_2 Q1 Uk 123 EMPL .2 .2 .2
TABLE_3 Q1 UK 123 EMPL .3 .4 .4
我要做的是将TABLE_3行与TABLE_1和TABLE_2进行比较,以获取OCT_14,NOV_14和DEC_14列。如果TABLE_3的数值是>比TABLE_1或2更希望它返回某种类型的标记,如'注意'。
就期望的输出而言,我可以拥有一个具有唯一名称的新行或一个新列,例如OCT_14_R。实际上首选新行。
TABLE PERIOD COUNTRY CODE POSITION OCT_14 OCT_14_R NOV_14 DEC_14
TABLE_1 Q1 UK 123 EMPL .2 .2 .2
TABLE_2 Q1 Uk 123 EMPL .2 .2 .2
TABLE_3 Q1 UK 123 EMPL .3 Attn .4 .4
OR
TABLE PERIOD COUNTRY CODE POSITION OCT_14 NOV_14 DEC_14
TABLE_1 Q1 UK 123 EMPL .2 .2 .2
TABLE_2 Q1 Uk 123 EMPL .2 .2 .2
TABLE_3 Q1 UK 123 EMPL .3 .4 .4
Comparison attn attn attn
答案 0 :(得分:0)
您可以使用窗口功能,例如
SELECT a.*,
CASE
WHEN (a.oct_14 <> MIN(a.oct_14) OVER(PARTITION BY CODE ORDER BY "TABLE"
RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING) THEN 'attn' END as oct_14_r
FROM your_view a;
我假设&#34;表+代码&#34;唯一(否则您需要更改PARTITION BY
)和..._ 14列不可为空。
&#34; oct_14_r&#34;会有&#39; attn&#39;当前行列不等于最小值2&#34;之前&#34; (按&#34; TABLE&#34;字段排序)行。
注意可能的性能问题 - 您正在使用视图,优化器可能会生成使用窗口/分析函数的错误执行计划查询
答案 1 :(得分:0)
Create Table V(TName VARCHAR(5), Oct_14 NUMBER(5,2), Nov_14 NUMBER(5,2), Dec_14 NUMBER(5,2));
Insert into V values('T1', 1.2, 1.2, 1.2);
Insert into V values('T2', 1.4, 1.5, 1.6);
Insert into V values('T3', 1.5, 1.5, 1.7);
SELECT TName, To_Char(Oct_14) Oct_14, To_Char(Nov_14) Nov_14, To_Char(Dec_14) Dec_14 from V
UNION
SELECT 'Compare',
(select 'ATTN' from dual where EXISTS (select 1 from V where TName = 'T3' and OCT_14 > ALL(SELECT OCT_14 FROM V WHERE TName IN ('T1','T2')))) Oct_14_Res,
(select 'ATTN' from dual where EXISTS (select 1 from V where TName = 'T3' and Nov_14 > ALL(SELECT Nov_14 FROM V WHERE TName IN ('T1','T2')))) Nov_14_Res,
(select 'ATTN' from dual where EXISTS (select 1 from V where TName = 'T3' and Dec_14 > ALL(SELECT Dec_14 FROM V WHERE TName IN ('T1','T2')))) Dec_14_Res
FROM dual;
还有其他方法可以做得更好。