2012-05-28 107 views
0

除了标签,我想解决这个问题,如果可能的话。 我有这个表计数第一次出现外键

activity_type | value | date  | company_id 
network.new | 1  | 2011-10-08 | 1 
members.count | 3  | 2011-10-08 | 1 
network.new | 1  | 2011-10-10 | 2 
network.new | 1  | 2011-10-11 | 3 
members.count | 4  | 2011-10-11 | 2 
  • 这基本上是一个日志活动。只有 每一次COMPANY_ID
  • “MEMBERS_COUNT”活动 “network.new”后,才每COMPANY_ID出现,每 COMPANY_ID可以每天出现一次发生
  • “network.new”活动发生。

我需要做一个线形图,X轴为日期,Y轴是两件事情的数量:

  1. 许多company_ids如何有成员活动的每一天为第一 时间(这是给我一个难的时间);
  2. 每个给定日期有多少人拥有network.new活动并且只有该活动 。

我试过的所有查询都给了我一个假阳性列表,主要是因为它计算每天都有'members_count'活动的company_id。

我希望,如果可能,创建一个查询,给我date,first_time_members,new_company列为create view目的。 我希望我的问题很清楚,不要傻,因为我找不到任何看起来接近我的问题的任何地方。

[编辑]

由于我的英语真的很差,我不能让自己清楚,我要去尝试解释痘痘更多:

我的客户有一个网络公司和他希望了解有多少 公司一天天地加入网络,但有一个问题:一家公司 登录网络时,它只有一个完成 之一,当它也有注册成员。所以他想知道,有多少公司进行“不完整”注册以及多少注册“完成” 。

奥利琼斯先生把我放在正确的方向,我认为我可以使用他强硬的我,但它还不正确。 感谢ollie Jones为您的答案。像你这样的答案让我喜欢这个网站。

+1

你能给我们一个样本结果。猜测你的意思是由会员和第一次。 –

回答

1

因此,使用同样的方法奥利·琼斯向我展示了我搞清楚: 首先,我需要日期的列表,其中“MEMBERS_COUNT”或“network.new”发生

SELECT date as current_date 
FROM activity_log ld 
WHERE `activity_type` in ('members_count', 'network.new') 
GROUP BY date 
ORDER BY date 

他们,我离开加入了第一次约会的公司列表出现

SELECT MIN(date) AS new_date, company_id 
FROM activity_log 
WHERE activity_type = 'network.new' 
GROUP BY company_id 
ORDER BY date 

也离开加入第一次有公司数量成员

SELECT min(date) as members_count_date, company_id 
FROM `activity_networks` WHERE `activity_type` = 'network.daily.members_count' 
GROUP BY company_id 
ORDER BY date 

然后a对新公司和首次统计会员的公司进行分组计数,按组日期排序。然后我有这个:

SELECT DATE(FROM_UNIXTIME(ld.date)) as curr_date, 
COUNT(DISTINCT(new_co)) as new_co, 
COUNT(DISTINCT(complete_co)) as complete 
FROM activity_log ld 
LEFT JOIN (SELECT date AS new_date, company_id as new_co 
FROM activity_networks 
WHERE activity_type = 'network.new' 
GROUP BY company_id 
ORDER BY date) nd ON (ld.date=nd.new_date) 
LEFT JOIN (SELECT min(date) as members_count_date, company_id as complete_co 
FROM `activity_log` WHERE `activity_type` = 'members_count' 
GROUP BY company_id 
ORDER BY date) mcd ON (mcd.members_count_date=ld.date) 
WHERE `activity_type` in ('members_count', 'network.new') 
GROUP BY DATE(FROM_UNIXTIME(ld.date)) 
ORDER BY ld.date 

独特的功能是至关重要的,因为没有它的计数是不正确的。这并不完美。我名为'new_co'的专栏应该只带来不完整的注册(不完整的手段,与注册公司挂钩的新注册人),但这些信息仍然有用。

+0

我很高兴你明白这一点。 –

1

我要坚持我的脖子出去猜猜你想要什么。您要求“第一次有多少公司_会员每天都有活动”。在这方面,这是一个非常难以理解的陈述。

我认为你的意思是这样的:对于每一天,有多少company_id值第一次出现在network.new活动类型中,并且有多少人在同一天伴随有非零members.count项目,有多少不是?

这里就是你要做的:

首先想到的一个查询,将给予每家公司出现在你的系统中的第一次约会的。尝试这个。

SELECT MIN(date) networknewdate, company_id 
    FROM table 
WHERE activity_type = 'network.new' 
GROUP BY company_id 

这产生networknewdate,COMPANY_ID的虚拟表。

接下来,您需要一个查询,将给予members.count项目变成了每家公司的第一次约会。

SELECT MIN(date) memberscountdate, company_id 
    FROM table 
    WHERE activity_type = 'members.count' 
    GROUP BY date 

好了,现在我们有两个很好的虚拟各有最多,每一列都COMPANY_ID值表。让我们加入他们,推动第一个(network.new)价值的联合。

SELECT a.networknewdate, 
     a.company_id, 
     IFNULL(b.members_present, 'no') members 
    FROM (
     SELECT MIN(date) networknewdate, company_id 
     FROM table 
     WHERE activity_type = 'network.new' 
     GROUP BY company_id 
    ) a 
    LEFT JOIN (
    SELECT MIN(date) memberscountdate, company_id, 'yes' members_present 
     FROM table 
     WHERE activity_type = 'members.count' 
     GROUP BY date 
    ) b ON (a.networknewdate = b.memberscountdate and a.company_id = b.company_id) 

这将返回三列:日期,COMPANY_ID和“是”或“否”的说法是否有在同一天为每个第一network.new记录第一members.count记录COMPANY_ID。

现在,你需要让你得到每天一个记录,用“是”的数量和上市“不”项目的数量来概括这件事。开始了。

的一天“是”的记录数。

SELECT networknewdate, count(*) yesrecords 
    FROM (
     SELECT a.networknewdate, 
      a.company_id, 
      IFNULL(b.members_present, 'no') members 
     FROM (
      SELECT MIN(date) networknewdate, company_id 
      FROM table 
      WHERE activity_type = 'network.new' 
      GROUP BY company_id 
     ) a 
     LEFT JOIN (
     SELECT MIN(date) memberscountdate, company_id, 'yes' members_present 
      FROM table 
      WHERE activity_type = 'members.count' 
      GROUP BY date 
     ) b ON (a.networknewdate = b.memberscountdate and a.company_id = b.company_id) 
    ) r 
WHERE r.members = 'yes' 
GROUP BY networknewdate 

按日期没有记录的数量是一个类似的查询。然后,您需要在网络更新中将这两个查询结合在一起,以便获得日期表,yesrecords,norecords。我将把它作为你的一个剪贴板练习。这是我写在GROUP BY networknewdate结尾的查询的两倍多。

欢迎使用实现真实世界业务逻辑的SQL!我认为关于这个问题的回家教训是你要求的结果很难指定。一旦你确切地指定了你想要的内容,编写一个查询来获得它是单调而重复的,但并不困难。

另一个小提示。您可以创建一些视图以便您的查询不那么庞大。

+0

谢谢,这是有用的,但不完全是我所需要的。我知道了。 – Palantir