如何执行多重过滤

时间:2017-06-22 15:12:39

标签: sql oracle

所以这是对问题的介绍。 2桌:

  • worker:worker_join_id,birth_date
  • client:client_join_id,worker_join_id,buy_date,client_action

我想要选择所有工作人员和最后一个客户关联到具有client_action条件的工作人员,以及所述客户端的最后一个buy_date。并添加其他表中的所有信息(与问题无关)

因此,用我的条件选择worker_join_id的一种方法是

select  w.worker_join_id, max(c.buy_date)
  from client c    
    join worker w
      on w.worker_join_id = c.worker_join_id
  where c.client_action IN ('BuyItem1', ''BuyItem2', ''BuyItem4')
  group by w.worker_join_id;

通过此选项,我可以访问我正在寻找的特定工作人员,以及我感兴趣的日期。 但是要从客户端表和其他表中添加信息,我需要做更多的连接。所以我想把这个请求放在“with”

with MyTable (worker_join_id, buy_date) as (
  select  w.worker_join_id, max(c.buy_date)
  from client c    
    join worker w
      on w.worker_join_id = c.worker_join_id
  where c.client_action IN ('BuyItem1', ''BuyItem2', ''BuyItem4')
  group by w.worker_join_id)

然后通过MyTable上的联接进行选择以过滤我想要的内容:

select {lots of things} 
from worker w 
inner join client c 
      on w.w.worker_join_id = c.worker_join_id 
      and c.buy_date = (select t.buy_date from MyTable t 
                       join client c_tmp  
                        on t.worker_join_id = c_tmp.worker_join_id)

你的sql中强者可能已经注意到了这个问题,但是我的子请求给出了太多行。在我看来,我希望“c_tmp.worker_join_id”和“c.worker_join_id”是同一个东西,所以我会得到我想要的东西,但事实并非如此。

所以也许我需要彻底改变问题的方法,但我现在有点阻止。

如果你们有我的问题的解决方案,我会等待共同体的反馈。 感谢。

3 个答案:

答案 0 :(得分:0)

这只是一个例子,首先运行子查询并检查

select {lots of things} 
from worker w 
       inner join client c 
      on w.worker_join_id = c.worker_join_id 
      and c.buy_date =  (select max(c.buy_date) buy_date from client c   join worker w
                          join client c_tmp  on w.worker_join_id = c.worker_join_id
                          where c.client_action IN ('BuyItem1', 'BuyItem2', 'BuyItem4') )

答案 1 :(得分:0)

看看窗口功能: https://docs.microsoft.com/en-us/sql/t-sql/functions/last-value-transact-sql

所以你想要一个工人的最后一个客户,对吗?

    $DeviceMappings = @();
    $charmap = 100;
    foreach($Disk in $Disks)
    {
        $volume = @{DeviceName="xvd$([char]$charmap)";Ebs=@{VolumeSize=$Disk.Size;DeleteOnTermination="true";VolumeType="gp2"}};
        $DeviceMappings += $volume;
        $charmap++;
    }

仅作为一个例子 SELECT DISTINCT stuff, last_value(c.client_join_id) OVER (PARTITION BY c.worker_join_id ORDER BY c.buy_date RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS last_client_join_id FROM worker w JOIN client c USING (worker_join_id) WHERE c.client_action IN ('BuyItem1', 'BuyItem2', 'BuyItem4') 的作用类似于PARTITION,而不将分组应用于结果集。因此GROUP BY获取每个组的最后一个值,按buy_date排序。

last_value是必要的,因为正如我之前所说,这不适用任何分组,所以你会有重复的。

答案 2 :(得分:0)

我认为你可以在子查询中的子查询之外引用表。

所以在我的情况下,我可以保持查询'架构'并像我这样进行查询

select {lots of things} 
from worker w 
inner join client c 
  on w.w.worker_join_id = c.worker_join_id 
  and c.buy_date = (select t.buy_date from MyTable t 
                    WHERE t.worker_join_id = c.worker_join_id)

在客户端表上使用引用允许我指定子查询,因此它只给出了匹配结果