mysql - 如何计算等于或加起来等于某个时移的记录?

标签 mysql sql database

假设我有一个名为“志愿者”的 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)你应用这个算法:

  1. 对这些区间进行排序,并将它们拆分为子区间,使它们不相交或相等。

  2. 统计每种类型的相等子区间的个数。

  3. 这个计数中的最小值就是你的答案。

关于mysql - 如何计算等于或加起来等于某个时移的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782711/

相关文章:

jquery - Bootstrap Datepicker 在插入到 MySQL 之前将格式从 dd.mm.yyyy 转换为 yyyy-mm-dd

sql - INNER Join 的案例声明

mysql - 如何查询结果以仅显示时间戳小于给定年份的用户 ID

java - 如何使用Java SQL插入不同数据类型的数据库表

mysql - 在sql查询中从另一个表引用表名

mysql,SQL 内连接内部结构

php - PHP中正确的存储库模式设计?

python - 使用python随机填充MySQL数据库 'freezing'

php - php 中与 adodb 连接时出错

php - 仅返回 LEFT JOIN 的最新结果