Mysql 如何计算事件的首次发生,按类型分组?

Mysql 如何计算事件的首次发生,按类型分组?,mysql,count,Mysql,Count,对于这个基本问题,我深表歉意,我在搜索后找不到答案 我有一张表格,上面有团队、水果、事件和时间戳 CREATE TABLE table1 (`team` int, `event` varchar(6), `fruit` varchar(6), `timestamp` timestamp) ; INSERT INTO table1 (`team`, `event`, `fruit`, `timestamp`) VALUES (100, 'seen', 'apple', '2005-06-20

对于这个基本问题,我深表歉意,我在搜索后找不到答案

我有一张表格,上面有团队、水果、事件和时间戳

CREATE TABLE table1
(`team` int, `event` varchar(6), `fruit` varchar(6), 
`timestamp` timestamp)
;

INSERT INTO table1
(`team`, `event`, `fruit`, `timestamp`)
VALUES
(100, 'seen', 'apple', '2005-06-20 12:13:00'),
(100, 'bought', 'apple', '2005-06-20 12:14:00'),
(100, 'seen', 'banana', '2005-06-20 12:15:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'banana', '2005-06-20 12:16:00'),
(300, 'seen', 'orange', '2005-06-20 12:16:00'),
(300, 'seen', 'apple', '2005-06-20 12:16:00'),
(300, 'bought', 'orange', '2005-06-20 12:17:00'),
(300, 'bought', 'apple', '2005-06-20 12:18:00')
;
目标是计算当天第一次购买每种水果的团队数量

这是假设表中的所有数据都来自同一天

期望值为:苹果=1,橙色=1,香蕉=0

此外,理想的脚本将解释时间戳中的空值

我是SQL的初学者,这个脚本不适用于团队

select fruit, count((select min(timestamp) from table1
where event = "bought")) 
from table1
group by fruit
;

提前谢谢你

考虑以下几点:

DROP TABLE IF EXISTS table1;

CREATE TABLE table1
(activity_id SERIAL PRIMARY KEY
,`team` int
,`event` varchar(6)
,`fruit` varchar(6),
`timestamp` timestamp)
;

INSERT INTO table1
(`team`, `event`, `fruit`, `timestamp`)
VALUES
(100, 'seen', 'apple', '2005-06-20 12:13:00'),
(100, 'bought', 'apple', '2005-06-20 12:14:00'),
(100, 'seen', 'banana', '2005-06-20 12:15:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'apple', '2005-06-20 12:16:00'),
(200, 'seen', 'banana', '2005-06-20 12:16:00'),
(300, 'seen', 'orange', '2005-06-20 12:16:00'),
(300, 'seen', 'apple', '2005-06-20 12:16:00'),
(300, 'bought', 'orange', '2005-06-20 12:17:00'),
(300, 'bought', 'apple', '2005-06-20 12:18:00')
;
这是假设表中的所有数据都来自同一天


这个问题的任何剩余方面都可以(而且在我看来,应该)在应用程序代码中得到解决。

@草莓的目标是计算有多少团队当天第一次购买苹果,有多少团队购买香蕉。。。等等。如果我的表已经存在,并且没有activityID主键,我是否应该创建该字段以便可以自联接?我应该通过这样一个过程来创建它:改变表格。。。添加约束。。。主键(col1、col2等)?我不确定仅仅将一组列链接在一起是否足以/良好地创建一个唯一的主键如果您没有某种唯一标识行的方法,那么是的-否则,您就没有真正的表。或者,若可以保证现有列的某些组合是唯一的,那个么您可以将此组合设置为主组合,并相应地重新排列我的查询。在这种情况下,我倾向于选择一个代理键,因为它使查询更简单。您的解决方案w/activity\u id是否假设第一个购买的水果的activity id是集合中的“min”?是;这似乎是一个合理的假设解决方案在这种情况下有效,但在一个需要对数百个表进行计算的实例中,我想我可能会遇到一些记录不总是按时间升序排列的情况。是否有一个简单的解决方法,可以使用min(时间戳)来计算这个值?或者我可以以某种方式按时间升序重新排列整个表,然后运行查询以确保准确性吗?
SELECT fruit
     , COUNT(*) total 
  FROM table1 x 
  JOIN 
     ( SELECT MIN(activity_id) activity_id FROM table1 WHERE event = 'bought' GROUP BY team ) y 
    ON y.activity_id = x.activity_id 
 GROUP 
    BY fruit;
+--------+-------+
| fruit  | total |
+--------+-------+
| apple  |     1 |
| orange |     1 |
+--------+-------+