繁体   English   中英

根据列条件从两个值中选择第一个值及其相关行,否则选择第二个值及其相关行

[英]Select first value and its related rows out of two values based on column condition otherwise select second value and its related rows

我有如下所示的Oracle SQL

select * 
from a
where a.description in ('Rebook All (1)', 'Created stock identifier') 
    and a.date between '03/18/2017 00:00:01' AND '03/25/2017 00:00:00'
    and a.unit = '38240007294677'

现在,结果可以像下面的单位编号一样具有多个描述,也可以具有1个描述。 当它同时具有单位编号的描述时,我只需要选择“全部重新预订(1)”(此描述可以有很多次/很多行,如下图所示),而不是“已创建库存标识符”及其相关详细信息从表a 如果在这2个中只有1个描述,则如果不存在“全部重新预订(1)”,则选择“已创建库存标识符”,反之亦然。

如何选择呢?

  Date                                         Description

3/20/2017 10:11:12.769000 AM Created stock identifier
3/20/2017 10:10:47.775000 AM Created stock identifier
3/20/2017 10:10:47.782000 AM Created stock identifier
3/20/2017 8:14:41.696000 PM Rebook all (1)
3/20/2017 8:14:41.885000 PM Rebook all (1)
3/20/2017 8:13:51.622000 PM Rebook all (1)

当同时具有单位编号的描述(“重新预订全部(1)”,“已创建的库存标识符”)然后应该仅获得(“重新预订全部(1)”)及其所有行时(但有单元号中只有1个描述(“重新预订全部(1)”,“创建的库存标识符”),然后获得该描述-

同时具有单位编号的两个描述(“全部重新预订(1)”,“已创建的库存标识符”)时,仅获得(“全部重新预订(1)”),如下所示-

3/20/2017 8:14:41.696000 PM Rebook all (1)
3/20/2017 8:14:41.885000 PM Rebook all (1)
3/20/2017 8:13:51.622000 PM Rebook all (1)

如果单位编号只有1个描述“创建的库存标识符”,则仅获取该“创建的库存标识符”-

3/20/2017 10:11:12.769000 AM Created stock identifier
3/20/2017 10:10:47.775000 AM Created stock identifier
3/20/2017 10:10:47.782000 AM Created stock identifier

这是达到要求的一种方法。 我使用RANK() OVER窗口函数根据DESC顺序中的描述对单位记录进行排名。

SELECT * 
FROM (
  SELECT UNIT
    , DESCRIPTION
    , RANK() OVER (PARTITION BY UNIT ORDER BY DESCRIPTION DESC) RN
  FROM MY_TABLE A
  WHERE A.DESCRIPTION IN ('Rebook all (1)'
                          , 'Created stock identifier')
    AND A.DATE BETWEEN '03/18/2017 00:00:01' AND '03/25/2017 00:00:00'
    --AND A.UNIT = '38240007294677'
)
WHERE RN = 1

从Oracle 12c开始:

select a.*
from a
where a.unit = '38240007294677' 
and a.description in ('Rebook All (1)', 'Created stock identifier') 
and a.date >= date '2017-01-18' 
and a.date <  date '2017-03-25'
order by case when a.description = 'Rebook All (1)' then 1 else 2 end
fetch first row with ties;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM