2014-12-01 18 views
0

我想使用Netflix作为此问题的示例,因为每个人都知道他们是谁。使用Netflix,有一个账户持有者,并且有用户。SQL只获取与数据库中其他地方的最短日期相关的数据

以我自己的Netflix账户为例,我是账户持有人(我每月支付),我的合作伙伴是我的房间伴侣的用户。所以1个帐户和3个用户。

我们想知道什么营销渠道贷记帐户。营销渠道是用户级别的数据点,而不是帐户级别。因此,我们将其基于第一个帐户用户如何找到我们然后想要将其应用于该帐户的逻辑。

这里是我工作的查询看起来像:

SELECT 
    my.data AS Account_ID, 
    co.ID AS User_ID, 
    def.def_medium, 
    MIN(co.created) # Don't ask why I used MIN here, was hoping it'd act like a WHERE clause. 
FROM 
    abc_emails.cid208 co 
INNER JOIN abc_emails.def208 def ON def.eid = co.id 
INNER JOIN abc_emails.my208 my ON my.eid = co.id AND my.my_id = 2765 
GROUP BY Account_ID, User_ID, def_medium 

这里是从查询结果中的一个样本:

Account_ID | User_ID | Medium | Created 
    1   447503  Email 2014-02-05 03:53:42 
    1   679769  Banner 2014-05-30 05:55:29 
    1000   6477  CPC  2007-01-22 10:03:03 
    10000  26805  Organic 2008-07-28 01:34:05 
    10000  151153  import 2011-06-16 06:57:41 
    10000  151154    2011-06-16 06:57:42 
    10000  151155    2011-06-16 06:57:42 
    10000  151156    2011-06-16 06:57:42 
    10000  151157  none 2011-06-16 06:57:42 

所以帐户ID为1,USER_ID 447503看起来像第一个已知的联系人,所以媒体应该是电子邮件。帐户1,000似乎只有一个用户,因此请使用CPC。 帐户10,000有几个用户,第一个已知用户是有机媒体。

所以我想改变这个查询来创建设置像这样的结果:

Account_ID | User_ID | Medium | Created 
1   447503  Email 2014-02-05 03:53:42 
1000  6477  CPC  2007-01-22 10:03:03 
10000  26805  Organic 2008-07-28 01:34:05 

ACCOUNT_ID会在结果集中不同的 - 没有重复。

  1. 我将如何做到这一点
  2. 是否有可能留下领域创造出了SELECT的一起做到这一点?
+0

'SELECT DISTINCT my.data AS ACCOUNT_ID ...' – r3wt 2014-12-01 19:47:58

回答

2

有很多方法可以做到这一点,其中一些是

select t1.* from abc_emails t1 
left join abc_emails t2 on t2.Account_ID = t1.Account_ID 
and t1.Created > t2.Created 
where t2.Account_ID is null; 

OR

select t1.* from abc_emails t1 
where not exists 
(
    select 1 from abc_emails t2 
    where t1.Account_ID = t2.Account_ID 
    and t1.Created > t2.Created 
) 
+0

感谢您抽出宝贵时间回答,但这并不能提供我预期的结果。你能看到我做错了吗? SELECT \t my.data, \t co.ID, def.def_medium, MIN(co.created) FROM \t abc_emails.cid208共同 LEFT JOIN abc_emails.cid208 CO1 ON co1.id = co.id AND co.created> co1.created INNER JOIN abc_emails.def208 def ON def.eid = co.id INNER JOIN abc_emails.my208 my ON my.eid = co.id AND my.my_id = 2765 WHERE co1.id IS NULL GROUP BY数据,ID,def_medium – 2014-12-01 20:15:10

+0

使用聚合函数,然后group by不保证您返回来自同一行的其他列。您可能需要通过使用上述技术或通过创建子查询来获得'min()'行来阻止它们。如果您可以使用某些数据创建sqlfiddle,则可以轻松提供精确的查询。 – 2014-12-01 20:18:00

+0

聚合是一个错字,查询实际上看起来像这样:SELECT \t my.data AS Account_ID, \t co.ID AS User_ID, def。def_medium, co.created FROM \t abc_emails.cid208共同 LEFT JOIN abc_emails.cid208 CO1 ON co1.id = co.id AND co.created> co1.created INNER JOIN abc_emails.def208 DEF ON def.eid = CO .id INNER JOIN abc_emails.my208 my ON my.eid = co.id AND my.my_id = 2765 WHERE co1.id IS NULL GROUP BY data,ID,def_medium,created 但是每个Account_ID仍然有很多结果什么时候应该只有一个? – 2014-12-01 20:30:58

相关问题