首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL秩选择oracle

SQL秩选择oracle
EN

Stack Overflow用户
提问于 2016-11-30 21:52:47
回答 2查看 47关注 0票数 0

我有一个问题,我的桌子如下所示;

REC_ID | Year | status | -------|-----------|----------| 123 | 2016 | OA | 123 | 2017 | CC |

我的查询应该检查是否为rec_id?如果

  1. 2016年有记录,当时的状态是OA,然后选择那一行。
  2. 2016年的记录是任何其他状态(不是OA),2017年也没有记录,然后选择这一行(2016年)。
  3. 2016年有任何其他状态的记录(不是OA),2017年有记录,然后选择2017年的记录。

因此,在上面的例子中,2016年的记录应该被拿起来。

REC_ID | Year | status | -------|-----------|----------| 456 | 2016 | OP |

在这个例子中,由于只有一个记录,2016年的记录应该被捡起来。

REC_ID | Year | status | -------|-----------|----------| 789 | 2016 | OM | 789 | 2017 | CC |

在最后一个例子中,由于有两个记录,而2016年不是OA,那么2017年的记录应该被拿起来。

我试过对他们进行排名,但这不起作用,我试着做了下面这样的事情,但这两项记录都被拿了起来。

代码语言:javascript
复制
 SELECT CASE
WHEN (STATUS = 'OA'
    AND YEAR              = TO_CHAR(SYSDATE, 'YYYY')
    AND ?= REC_ID)
    OR ((SELECT COUNT(*)
      FROM TABLE
      WHERE ?= REC_ID
      AND YEAR = TO_CHAR(add_months(sysdate, 12), 'YYYY' ))= 0)
    THEN TABLE.STATUS
    ELSE
      (SELECT STATUS
      FROM TABLE
      WHERE ?= REC_ID
      AND YEAR       = TO_CHAR(add_months(sysdate, 12), 'YYYY' )
      )
  END from TABLE WHERE ?= REC_ID ;
EN

Stack Overflow用户

发布于 2016-11-30 21:59:39

这是一个优先级查询,建议使用row_number()。我想你想:

代码语言:javascript
复制
select t.*
from (select t.*,
             row_number() over (partition by rec_id
                                order by (case when year = 2016 and status = 'OA' then 1 else 2 end),
                                         year desc
                               ) as seqnum
      from table t
      where year in (2016, 2017)
     ) t
where seqnum = 1;
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40898883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档