如何使用Oracle SQL为多列比较相同列中的数值

如何使用Oracle SQL为多列比较相同列中的数值,sql,oracle,Sql,Oracle,我有一个视图,它组合了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个具有这种结构的表中的数据

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
我试图做的是比较表3行与表1和表2的OCT_14、NOV_14和DEC_14列。如果表3的数值大于表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


例如,您可以使用窗口函数

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;
选择一个*,
案例
当(a.oct_14 MIN(a.oct_14)结束时(按代码分区,按“表”排序)
范围在前2个和前1个之间),然后“附件”结束为2014年10月
从你的观点来看;
我假设“table+code”是唯一的(否则您需要更改
分区,并且…\u 14列不可为空。
当当前行列不等于2“上一行”(按“表”字段排序)的最小值时,“oct_14_r”将具有“attn”值

当心可能出现的性能问题-您使用的是view,优化器可能会生成错误的执行计划查询,这些查询使用窗口/分析函数

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;

应该有其他更好的方法。

我不太确定,但对于这种工作,通常“最好”在原始表级别上工作,而不是在或多或少的“人工”上工作视图--无论如何,您可能需要进行自连接和/或自子查询。您好..谢谢您的想法..我会尝试一下。唯一的元素实际上是,句号,国家,代码和位置,所以我想我会用逗号分隔它们。谢谢您,我最喜欢查询的输出。谢谢您。我仍然需要,句号,输出中的国家/地区、代码和位置,并按期间、国家/地区、代码和位置进行排序。不确定如何在我的结果中添加这些。查询块的结果列不正确,直到可以根据我上面的评论使用一些建议。位总的来说,这是可行的。谢谢
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;