我要坚持我的脖子出去猜猜你想要什么。您要求“第一次有多少公司_会员每天都有活动”。在这方面,这是一个非常难以理解的陈述。
我认为你的意思是这样的:对于每一天,有多少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!我认为关于这个问题的回家教训是你要求的结果很难指定。一旦你确切地指定了你想要的内容,编写一个查询来获得它是单调而重复的,但并不困难。
另一个小提示。您可以创建一些视图以便您的查询不那么庞大。
你能给我们一个样本结果。猜测你的意思是由会员和第一次。 –