【发布时间】:2010-09-20 15:35:58
【问题描述】:
我有一个表,其中一个或多个具有相同“id”值的条目可以插入到我们的日志/事实表中(包含超过 100+ 百万条记录)
以设定的频率将一条新记录插入到此表中,并为“created”和“view_percent”列(观看视频的百分比)设置一个新值。
对于两个不同的查询,我想返回:
预期结果 1:
+------------------+--------------+-------------+------------------+------------+
| archive_asset_id | asset_title | count_asset | avg_view | time_day |
+------------------+--------------+-------------+------------------+------------+
| 83386 | Oliver James | 4 | 36.75 | 2010-08-09 |
+------------------+--------------+-------------+------------------+------------+
使用此查询,我无法在执行聚合函数时过滤掉必要的记录...取而代之的是所有行的平均值,结果值为 31.307
SELECT archive_asset_id, asset_title, COUNT(DISTINCT id * 1000000 + archive_asset_id) AS count_asset, AVG(view_percent) AS avg_view, FROM_UNIXTIME(created, '%Y-%m-%d') AS time_day
FROM log_embed_video
WHERE archive_asset_id = 83386
AND created >= 1281312000
AND created < 1281484800
GROUP BY time_day
ORDER BY time_day;
预期结果 2:
+------------+------------------+---------------+------------------+-------------------------------+
| time_day | archive_asset_id | asset_title | MAX(view_percent) | occurrences MAX(view_percent) |
+------------+------------------+---------------+------------------+-------------------------------+
| 2010-08-09 | 83386 | Oliver James | 13 | 1 |
| 2010-08-09 | 83386 | Oliver James | 17 | 2 |
| 2010-08-09 | 83386 | Oliver James | 100 | 1 |
+------------+------------------+---------------+-------------------+------------------------------+
这是我用于结果 2 的查询,但不是我想要的... log_embed_video.id 的组产生 4 个结果... 这是给定查询的预期结果,但不是预期的输出。
SELECT id, FROM_UNIXTIME(created, '%Y-%m-%d') AS time_day, archive_asset_id, asset_title, COUNT(DISTINCT id * 1000000 + archive_asset_id) AS 'count_asset', MAX(view_percent) as 'max_view_percent'
FROM log_embed_video
WHERE archive_asset_id = 83386
AND created >= 1281312000
AND created < 1281484800
GROUP BY time_day, id
条件数据:
带有 KEEP 标记的行是我在返回结果 1 和结果 2 时要使用的数据。
SELECT id, archive_asset_id, asset_title, view_percent, FROM_UNIXTIME(created, '%Y-%m-%d') AS time_day
FROM log_embed_video
WHERE archive_asset_id = 83386
AND created >= 1281312000
AND created < 1281484800
ORDER BY id, view_percent;
+----------+------------------+--------------+--------------+------------+
| id | archive_asset_id | asset_title | view_percent | time_day |
+----------+------------------+--------------+--------------+------------+
| 43326898 | 83386 | Oliver James | 0 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43326898 | 83386 | Oliver James | 13 | 2010-08-09 | + KEEP
| 43432090 | 83386 | Oliver James | 0 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43432090 | 83386 | Oliver James | 17 | 2010-08-09 | + KEEP
| 43432092 | 83386 | Oliver James | 0 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43432092 | 83386 | Oliver James | 17 | 2010-08-09 | + KEEP
| 43470093 | 83386 | Oliver James | 0 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43470093 | 83386 | Oliver James | 17 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43470093 | 83386 | Oliver James | 35 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43470093 | 83386 | Oliver James | 52 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43470093 | 83386 | Oliver James | 69 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43470093 | 83386 | Oliver James | 87 | 2010-08-09 | - DISCARD RECORD / DUPLICATE
| 43470093 | 83386 | Oliver James | 100 | 2010-08-09 | + KEEP
+----------+------------------+--------------+--------------+------------+
表格和原始数据:
CREATE TABLE `log_embed_video` (
`id` int(11) NOT NULL,
`archive_asset_id` int(11) NOT NULL,
`asset_title` varchar(255) NOT NULL,
`view_percent` float NOT NULL,
`created` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `log_embed_video` VALUES
(43326898, 83386, 'Oliver James', 0, 1281327306),
(43326898, 83386, 'Oliver James', 13, 1281327327),
(43432090, 83386, 'Oliver James', 0, 1281371423),
(43432090, 83386, 'Oliver James', 17, 1281371445),
(43432092, 83386, 'Oliver James', 0, 1281371424),
(43432092, 83386, 'Oliver James', 17, 1281371446),
(43470093, 83386, 'Oliver James', 0, 1281380789),
(43470093, 83386, 'Oliver James', 17, 1281380810),
(43470093, 83386, 'Oliver James', 35, 1281380830),
(43470093, 83386, 'Oliver James', 52, 1281380850),
(43470093, 83386, 'Oliver James', 69, 1281380871),
(43470093, 83386, 'Oliver James', 87, 1281380891),
(43470093, 83386, 'Oliver James', 100, 1281380906);
【问题讨论】:
-
我在里面找不到问题 - 我真的不知道你在问什么。
-
+1 用于示例数据并创建表...但是(对我而言)您想要实现的目标仍然不是很清楚(尝试用文字解释“期望的结果”;只是盯着数据没有帮助我理解你想要达到的目标)
-
代码应该如何处理跨越到第二天(即:23:59 => 50 % / 00:01 => 55%)?
-
我不确定是否过滤掉重复数据。参考条件数据。我有 4 行要保留,过滤掉所有其他行,然后能够使用聚合函数并对过滤后的数据进行分组。
-
@ Wrikken - 我需要过滤掉重复的行...例如,有 2 条记录的 id 为 43326898。包含该 id 的行和 view_percent 列的最大值/最大值是我要过滤的内容
标签: mysql group-by aggregate-functions