查询子选择至少一个

时间:2018-11-10 17:22:43

标签: sql oracle subquery

我有一个名为Movement_history的表(代表汽车的动向(登记,出售,吊销,修理,毁坏))。我想获得一家公司的信息 已经卖出了每辆车,卖给了谁。

这是我的桌子(选择*)

code_car  date_movement  type_movement  current_company_code
  6000     01/01/2010       NEW              5
  6000     01/01/2012       REPARATION       5
  6000     01/11/2015       SOLD             8
  6000     01/01/2017       DESTROYED        8
  4444     01/05/2000       NEW              10
  4444     01/05/2000       SUSPENDED        10
  4444     01/05/2015       SOLD             5
  4444     01/07/2015       RENOVATION       5
  4444     09/12/2015       SOLD             18
  ....      ...             ...              ...

因此,如果我希望在确定的时间(2015年1月1日至2015年2月31日)中出售公司5的所有汽车,则结果如下:

  code_car  date_movement  type_movement  current_company_code
  6000     01/11/2015       SOLD             8
  4444     09/12/2015        SOLD             18

这是我的查询。首先,我有一天从公司5获得了所有汽车。然后,我获得了所有“卖出”的动向,如果某天成为公司5的一部分,我想获得每辆售出的汽车。

select 
    code_car,date_movement,type_movement,current_company_code 
from 
    movement_history where code_car in (
        (select code_car from movement_history where current_company_code = 5)) and 
code_car IN     
        (select code_car from movement_history where type_movement = 
        'SOLD' and code_car <> 5 and date_movement > to_Date('01-01-2015','dd/mm/yyyy') and date_movement < to_Date('31-12-2015','dd/mm/yyyy'));

如果某天售出的每辆汽车至少有5次成为公司的一部分,我想这是很难做的。

有什么建议吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

我明白了。 current_company_code汽车的公司。因此,您想使用LAG()

select mh.*
from (select mh.*,
             lag(mh.current_company_code) over (partition by mh.code_car order by date_movement) as prev_ccc
      from movement_history mh
     ) mh
where mh.type_movement = 'SOLD' and
      mh.date_movement >= date '2015-01-01' and
      mh.date_movement < date '2016-01-01' and
      mh.prev_ccc = 5;