0

Besides the tags, I would like to solve this on query, if possible. I have this table

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
  • That's basically a log activity.
  • 'network.new' activity occur only once per company_id
  • 'members_count' activity occur only after 'network.new' appears per company_id and can appear once per day per company_id.

I need to make a line graph that the X axis is the date, the Y axis is the quantity of two things:

  1. How many company_ids have members each day of activity for the first time (That is the one that is giving me a hard time);
  2. How many have the network.new activity and only that activity for each given day.

All queries I tried gave me false-positive lists, mostly because it counts company_ids that have the 'members_count' activity every day.

I wish, if possible, to create a query that give me date, first_time_members, new_company columns for create view purposes. I hope my question was clear enough, and not silly because I couldn't find it anything that looks close to my problem anywhere.

[EDIT]

Since my english is really poor, I couldn't make myself clear I'm going to try explain a litle more:

My client have a network of companies and he wishes to learn how many companies join the network day by day but there's a catch: A company when sign in for the network, it is only considered a completed one when it is also had registered members. So he wants to know, how many companies make a 'incomplete' sign up and how many make a 'complete' sign up.

Mr Ollie Jones put me in the right direction, I think I can use what he tough me, but it is not right there yet. Thank ollie Jones for your answer by the way. Answers like yours made me love this site.

4

2 回答 2

1

我会伸出我的脖子,猜猜你想要什么。您是在询问“每天有多少 company_ids 第一次有活动成员”。恕我直言,这是一个很难理解的声明。

我认为您的意思是:对于每一天,在 network.new 活动类型中第一次出现多少 company_id 值,其中有多少伴随着非零成员。在同一天计数项目,有多少是不是?

这是你要做的:

首先考虑一个查询,它将给出系统中出现的每家公司的第一个日期。尝试这个。

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 和“yes”或“no”,表示是否有第一个 members.count 记录与每个 company_id 的第一个 network.new 记录在同一天。

现在您需要总结整个事情,以便您每天获得一条记录,列出“是”项的数量和“否”项的数量。开始了。

每天“是”记录的数量。

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

按日期的无记录数是一个类似的查询。然后,您需要在 networknewdate 上将这两个查询左连接在一起,这样您就可以得到一个日期表,yesrecords,norecords。我将把它作为一个剪切粘贴练习留给你。它比我写的以GROUP BY networknewdate.

欢迎使用实现真实世界业务逻辑的 SQL!我认为关于这个问题的带回家的教训是,您要求的结果实际上很难指定。一旦你准确地指定了你想要的,编写一个查询来得到它是乏味和重复的,但并不难。

另一个小提示。创建一些视图可能对您有意义,这样您的查询就不会那么庞大。

于 2012-05-29T01:35:46.130 回答
1

因此,使用 Ollie jones 向我展示的相同方法,我想通了:首先,我需要一个“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'应该只带来不完整的注册(不完整的意思是新注册,没有与公司关联的成员),但这些信息仍然很有用。

于 2012-05-29T15:13:31.190 回答