如何根据条件流程图进行多项选择?

时间:2016-11-08 15:54:33

标签: sql database oracle

表名:副本

+------------------------------------------------------------------------------------+
|         group_id  |  my_id   |  previous  |  in_this   |  higher_value |  most_recent  |
+----------------------------------------------------------------------------------------------------------------
|        900        |    1     |   null     |     Y      |       7       |       May16    |
|        900        |    2     |   null     |     Y      |       3       |       Oct  16    |
|        900        |    3     |   null     |     N      |       9       |       Oct 16      |
|        901        |    4     |   378      |     Y      |      3        |      Oct 16      |
|        901        |    5     |   null     |     N      |      2        |       Oct 16     |
|       902         |    6     |   null     |     N      |       5       |       May16    |
|       902         |    7     |   null     |     N      |       9       |     Oct 16    |
|       903         |    8     |   null     |     Y      |       3       |        Oct 16    |
|       903         |    9     |   null     |     Y      |       3       |         May16   |
|      904          |   10     |   null     |     N      |       0       |       May 16   |
|      904          |   11     |   null     |     N      |       0       |       May16
--------------------------------------------------------------------------------------

输出表

+---------------------------------------------------------------------------------------------------+
|    group_id        |  my_id       |  previous     |  in_this       |  higher_value               |most_recent|
+----------------------------------------------------------------------------------------------------
|        900        |    1         |   null         |     Y          |       7                   |       May16    |
|       902         |    7         |   null         |     N          |       9                   |        Oct 16    |
|       903         |    8         |   null         |     Y           |       3                   |        Oct 16    |
---------------------------------------------------------------------------------------------------------

大家好,我需要一个查询的帮助,该查询根据字段的重要性返回组内的一条记录。重要性排名如下:

上一页 - 如果group_id中的一条记录不为空,则不返回group_id中的记录(因为根据我们的规则,组内的所有记录都应具有相同的先前值)< / p>

in_this - 如果一个记录是Y,另一个记录是group_id中的N,那么我们保留Y;如果所有记录都是Y或全部都是N,那么我们将转到下一个属性

Higher_value - 如果'in_this'字段中的所有记录都相等,那么我们需要从该字段中选择值较大的记录。如果两个记录的值相等,我们将转到下一个属性

Most_recent - 如果所有记录在'higher_value'字段中的值相等,那么我们会考虑最新记录。如果它们相等,则不返回任何内容。

这是我正在查看的表的简化版本,但我想了解这样的事情是如何工作的。基本上,我的表有多个记录副本,这些记录已通过某种算法分组。我的任务是选择一组中的哪些记录是“好的”,我们基于这些字段。

我希望输出实际显示所有字段,因为我可能会尝试优化查询以包含其他字段(有40多个要考虑),但最重要的是group_id和my_id字段。如果我们还能以某种方式标记为什么每条记录都被选中,那将是很好的,但这不是必要的。

似乎这样的事情应该很简单,但我很难绕过如何从group_id中挑选。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用分析函数。诀窍是为每个条件建立正确的变量:

select t.*
from (select t.*,
             max(in_this) over (partition by group_id) as max_in_this,
             min(higher_value) over (partition by group_id) as min_higher_value,
             max(higher_value) over (partition by group_id) as max_higher_value,
             row_number() over (partition by group_id, higher_value order by my_id) as seqnum_ghv,
             min(most_recent) over (partition by group_id) as min_most_recent,
             max(most_recent) over (partition by group_id) as max_most_recent,
             row_number() over (partition by group_id order by most_recent) as seqnum_mr
      from t
     ) t
where max_in_this is not null and
      ( (min_higher_value <> max_higher_value and seqnum_ghv = 1) or
        (min_higher_value = max_higher_value and min_most_recent <> max_most_recent and seqnum_mr = 1
        )
      );

如上所述的第三个条件毫无意义,但您应该了解如何实现这一点。