具有多个规则的组的SQL查询

时间:2017-04-25 19:24:51

标签: sql oracle10g rdms

我有一个名为RXData的表,它有3个可能的测量值,称为runFactors。这是表格的结构:

year,  compound, primary_runfactor sec_run_factor, qual_factor
 2015    RX1        0.12             0.22             1.3
 2015    RX1        0.33             0.22             1.3
 2015    RX1        0.12             0.22             1.3
 2016    RX2        0.12             0.22             1.4
 2016    RX2        0.12             0.22             1.4
 2016    RX2        0.12             0.22             1.6
 2016    RX2        0.12             0.22             1.7

查询的目标是按复合和年份对数据进行分组,然后找到最佳的runFactors。选择runFactors的规则如下:

       Choose the maximum primary_run_factor of the group
         If there is a maximum value, select that row
         else if there is no maximum primary_run_factor
           Select the maximum sec_run_factor
          if there is a maximum sec_run_factor, select that row
          else if there is no maximum sec_run_factor
          then Select the maximum qual_factor
          if there is a maximum qual_factor, select that row
         else select a random qual_factor for the group

如果没有最大的qual_factor,请为该组选择一个随机的qual_factor。

例如,按年份排列的组和2015年的复合RX1将具有以下行:

 2015    RX1        0.12             0.22             1.3
 2015    RX1        0.33             0.22             1.3
 2015    RX1        0.12             0.22             1.3

根据上述规则,该组的最大primary_run_factor将为0.33,因此我们选择第2行。

对于组2016,复合RX2,行如下:           2016 RX2 0.12 0.22 1.4           2016 RX2 0.12 0.22 1.4           2016 RX2 0.12 0.22 1.6           2016 RX2 0.12 0.22 1.7

所有4行的最大primary_run_factor相同,因此我们比较最大sec_run_factor。它们也是一样的。接下来我们比较最大的qual_factor并找到最大值为1.7,所以我们选择第4行。我能够通过使用group by来编写各个查询,但是将它们放在一起以使用指定的规则是挑战。我很感激帮助解决这个问题。下面的查询找到了案例的最大runFactors。这就是把问题全部放在一起。

 select compound,year,max(primary_run_factor)
 from RXData
 group by compound,year

 select compound,year,max(sec_run_factor)
 from RXData
 group by compound,year

 select compound,year,max(qual_factor)
 from RXData
 group by compound,year


   //Select a random row

   select year,compound,qual_factor from
   ( select year,compound,qual_factor from RXData
     order BY dbms_random.value
   ) as rand_row
   group by rand_row.year,rand_row.compound
   where rownum = 1 

0 个答案:

没有答案