我有以下架构(两个表):
**APPS**
| ID (bigint) | USERID (Bigint) | USAGE_START_TIME (datetime) |
------------------------------------------------------------------
| 1 | 12 | 2013-05-03 04:42:55 |
| 2 | 12 | 2013-05-12 06:22:45 |
| 3 | 12 | 2013-06-12 08:44:24 |
| 4 | 12 | 2013-06-24 04:20:56 |
| 5 | 13 | 2013-06-26 08:20:26 |
| 6 | 13 | 2013-09-12 05:48:27 |
**USAGE**
| ID (bigint) | APPID (bigint) | DEVICEID (bigint) | HIGH_COUNT (bigint) | MEDIUM_COUNT (bigint) |
--------------------------------------------------------------------------------------------------------
| 1 | 1 | 2 | 400 | 200 |
| 2 | 1 | 3 | 200 | 100 |
| 3 | 2 | 3 | 350 | 40 |
| 4 | 3 | 4 | 2 | 400 |
| 5 | 4 | 2 | 4 | 30 |
| 6 | 5 | 3 | 50 | 300 |
解释:
所以,有两张表。
现在我想找到以下内容:
给定一个 USERID,获取 HIGH_COUNT 和 MEDIUM_COUNT 的总和。计数的同时
SUM 应注意: 如果在使用中,则使用相同的设备
超过一次,则具有最新信息的记录(基于
APPS.USAGE_START_TIME),在计算时应考虑
和。
For ex:
对于上面的模式,结果应该是(对于 userid=12):
| HIGH_COUNT (bigint) | MEDIUM_COUNT (Bigint) |
-----------------------------------------------
| 356 | 470 |
SQL 小提琴:http://sqlfiddle.com/#!2/74ae0f http://sqlfiddle.com/#!2/74ae0f
如果用户使用多个APPS
在一台设备上,此查询将使用APPS
最高的行usage_start_time
:
select a.userid
, sum(u.high_count)
, sum(u.medium_count)
from apps a
join `usage` u
on u.appid = a.id
join (
select u.device_id
, a.userid
, max(a.usage_start_time) as max_start_time
from apps a
join `usage` u
on u.appid = a.id
group by
u.device_id
, a.userid
) filter
on filter.device_id = u.device_id
and filter.userid = a.userid
and filter.max_start_time = a.usage_start_time
group by
a.userid
在您的数据集中,它将选择使用行5, 3, 4
对于用户12
.
查看它在 SQL Fiddle 中的工作情况。 http://sqlfiddle.com/#!9/29aad/9/0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)