假设我有一个名为“志愿者”的 mysql 表,它显示了已注册在特定时间轮类工作的人员:
Volunteers
==============
**UserId** int
**StartTime** datetime
**EndTime** datetime
假设此表包含以下记录:
(1, '2012-01-01 00:00:00', '2012-01-01 01:00:00')
(2, '2012-01-01 00:00:00', '2012-01-01 00:30:00')
(3, '2012-01-01 00:30:00', '2012-01-01 01:00:00')
(4, '2012-01-01 00:00:00', '2012-01-01 00:15:00')
(5, '2011-12-31 23:00:00', '2012-01-01 02:00:00')
(6, '2012-01-01 00:00:00', '2012-01-01 00:00:30')
(7, '2012-01-01 00:00:00', '2012-01-01 00:40:00')
(8, '2012-01-01 00:20:00', '2012-01-01 01:00:00')
我想计算此表中用户已注册从 00:00:00 到 01:00:00 工作的所有记录,但在此计数中还包括可以聚合到此所需时移的时移。
例如,使用上面的示例,理想的 sql 查询将返回 4。
解释:
用户 1 已注册完成所需的整个类次,因此计数加 1。
用户 2 和 3 已注册工作时间类次,该时间类次汇总到所需的时间类次,因此 这会将计数加 1。
用户 4 的时移无法与其他用户的时移相加来涵盖所需的时移,因此这不会添加到计数中。
用户 5 覆盖了整个所需的时移,因此计数加 1。
用户 6 有一个时间偏移,可以与用户 8 的时间偏移聚合以覆盖所需的时间偏移,因此这会将计数加 1。
用户 7 的时间偏移可以与用户 8 的时间偏移聚合以覆盖所需的时间偏移,但如果用户 8 已经与用户 6 聚合以产生所需的时间偏移,则不应将其包含在计数中。因此,这不会添加到计数中。
因此,计数等于 4。
你会怎么做?这可能吗?
最佳答案
我认为您的问题不适合用 SQL 完全解决。以下是我的解决方法。
选择与您感兴趣的类次重叠的所有志愿者。
然后在你的应用层(php/.NET/perl/whatever)你应用这个算法:
对这些区间进行排序,并将它们拆分为子区间,使它们不相交或相等。
统计每种类型的相等子区间的个数。
这个计数中的最小值就是你的答案。
关于mysql - 如何计算等于或加起来等于某个时移的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782711/