2017-06-22 60 views
0

因此,这里是一个问题的介绍。 2表:如何执行多个过滤器

  • 工人:worker_join_id,birth_date
  • 客户端:client_join_id,worker_join_id,购买日期,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 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”是同一件事,所以我会得到我想要的,但事实并非如此。

所以,也许我需要彻底改变我的方式围绕问题,但我现在有点块。

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

+0

我是一个oracle数据库 – kaless

回答

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) 

使用在客户端表的引用允许我指定子查询,所以只给了我匹配结果

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')) 
+0

上我会尽力,明天(我假设你忘记删除“交割日”和“加入客户c_tmp”中的子查询) – kaless

+0

不,我不工作,子请求只给出客户买东西的最新日期。而且我最终也只有一名工人。 或者其目的是选择每个员工,并附上与他们相关的特殊购买日期 – kaless

0

在窗口函数请看: https://docs.microsoft.com/en-us/sql/t-sql/functions/last-value-transact-sql

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

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,但不将分组应用到结果集。所以last_value取得每个组的最后一个值,由buy_date排序。

DISTINCT是必要的,因为,正如我前面所述,这不适用于任何分组,因此您将不得不重复。

+0

我实际上是在寻找工作人员执行特定操作的最后一个客户。 以前不要使用分区,我会检查W3C文档它的功能 – kaless

+0

不要检查W3C文档。 W3C适用于Web技术。 SQL不是W3C的事情。 据我所知,很少有数据库引擎支持这个功能,其中2个是PostgreSQL(以及Amazon RedShift)和Microsoft SQL Server,这正是您可能使用的。尽管它们使用的语法略有不同。 请参阅您正在使用的RDBMS的文档。 窗口函数允许您在数据的子集上向前或向后看,或者以某种方式或其他方式对其进行排名。在这种情况下,它获取数据子集的最后一个值。 – AlexanderMP