我试图得到每个设备每天的平均事件数。我已经让它大部分工作了,但不能让一组一组的设备吐出所有的设备。
数据如下:
user_id device attribution event_date
1 Desktop Organic 2019-09-02 16:21:44
2 Mobile Organic 2019-09-03 16:22:25
3 Desktop Direct 2019-09-04 16:22:27
4 Tablet Organic 2019-09-04 16:22:29
5 Desktop Email 2019-09-04 16:22:31
6 Desktop Email 2019-09-04 16:25:59
7 Desktop Organic 2019-09-05 16:21:44
SELECT dt.device AS AcquisitionType, AVG(dt.events) AS AverageEvents
FROM ( SELECT u.device,
COUNT (u.event_date) AS events
FROM users AS u
GROUP BY DATE(event_date)
) AS dt
GROUP BY dt.device
;
没有任何错误。一切正常,除了我不能得到按设备分组的结果。
最佳答案
我没发现你的问题,
一旦我在内部查询中添加了GROUP BY u.device,DATE(event_date)
,因为我的mysql只在完整分组中运行,但是从@paulspiegel的评论来看,似乎是因为你只在日期上分组,而且你的mysql不是“唯一完整分组”模式,那么mysql只是抛出了你所有不同的设备信息,以便让查询成功。我假设mysql在概念上重写了您的查询,这样它就不再是内部的select device, count..
我强烈建议您激活“仅完整分组方式”模式,这将要求您使用分组方式中的设备,因为您已经在选择列表中使用了它
另外,我还提供以下优化:
希望每个设备(select max(device), count ...
)的事件总数(COUNT(*)
)除以设备引发事件的不同天数(GROUP BY device
)的总数。桌面在3个不同的日子里有5个事件,所以预计大约是1.667。另外两个每天一个:
SELECT
u.device AS AcquisitionType,
COUNT(*)/COUNT(DISTINCT DATE(u.event_date)) AS AverageEvents
FROM users u
GROUP BY u.device;
我做了一把小提琴来演示:
模式(mysql v5.7)
CREATE TABLE users (
`user_id` INTEGER,
`device` VARCHAR(15),
`sc` VARCHAR(15),
`event_date` timestamp
);
INSERT INTO users
(`user_id`, `device`, `sc`, `event_date`)
VALUES
('1', 'Desktop','Organic', '2019-09-02 16:21:44'),
('2', 'Mobile', 'Organic','2019-09-03 16:22:25'),
('3', 'Desktop','Direct', '2019-09-04 16:22:27'),
('4', 'Tablet', 'Organic','2019-09-04 16:22:29'),
('5', 'Desktop','Email', '2019-09-04 16:22:31'),
('6', 'Desktop','Email', '2019-09-04 16:25:59'),
('7', 'Desktop','Organic', '2019-09-05 16:21:44');
查询1
SELECT
u.device AS AcquisitionType,
COUNT(*)/COUNT(DISTINCT DATE(u.event_date)) AS AverageEvents
FROM users u
GROUP BY u.device;
| AcquisitionType | AverageEvents |
| --------------- | ------------- |
| Desktop | 1.6667 |
| Mobile | 1 |
| Tablet | 1 |
View on DB Fiddle
关于mysql - SQL - 按设备类型获取平均计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57810024/