sql - 如何找到日期范围最重叠的时间段

标签 sql oracle date time

假设您有一个包含标识符,开始时间和结束时间的表。这些开始和结束时间可以是任何时间长度。开始时间总是早于结束时间。假设没有空值。

哪种查询会告诉我最“受欢迎”的时间,即每行的两个范围与其他最多的行重叠的地方?

现实生活中的应用是,它是一个记录用户登录和注销时间的表格。我想编写一个查询,该查询将告诉我何时有最多并发用户登录,并查看这段时间。

谢谢你。

最佳答案

这是使用简单自连接和GROUP BY的示例解决方案:

WITH d(id, t1, t2) AS (
    SELECT 1, date '2010-01-01', date '2010-03-01' FROM DUAL UNION ALL
    SELECT 2, date '2010-02-01', date '2010-04-01' FROM DUAL UNION ALL
    SELECT 3, date '2010-02-01', date '2010-04-01' FROM DUAL UNION ALL
    SELECT 4, date '2010-01-01', date '2010-01-03' FROM DUAL UNION ALL
    SELECT 5, date '2011-01-01', date '2011-02-15' FROM DUAL
)
SELECT d1.id, d1.t1, d1.t2, 
       COUNT(*) "Overlap count", 
       LISTAGG('[' || d2.t1 || ', ' || d2.t2 || ']', ', ')
       WITHIN GROUP (ORDER BY d2.id) "Overlapping intervals"
FROM d d1 
LEFT OUTER JOIN d d2 
ON d2.t1 <= d1.t2 AND d1.t1 <= d2.t2
GROUP BY d1.id, d1.t1, d1.t2
ORDER BY COUNT(*) DESC
"Overlapping intervals"聚合仅用于说明。

SQLFiddle

...输出:
| ID | OVERLAP COUNT |                                                                          OVERLAPPING INTERVALS |
|----|---------------|------------------------------------------------------------------------------------------------|
|  1 |             4 | [01-JAN-10, 01-MAR-10], [01-FEB-10, 01-APR-10], [01-FEB-10, 01-APR-10], [01-JAN-10, 03-JAN-10] |
|  2 |             3 |                         [01-JAN-10, 01-MAR-10], [01-FEB-10, 01-APR-10], [01-FEB-10, 01-APR-10] |
|  3 |             3 |                         [01-JAN-10, 01-MAR-10], [01-FEB-10, 01-APR-10], [01-FEB-10, 01-APR-10] |
|  4 |             2 |                                                 [01-JAN-10, 01-MAR-10], [01-JAN-10, 03-JAN-10] |
|  5 |             1 |                                                                         [01-JAN-11, 15-FEB-11] |

关于sql - 如何找到日期范围最重叠的时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24741256/

相关文章:

java - 从数据库自动创建实体

python - 尝试使用 Pandas 和 SQLAlchemy 从数据库导入时出错

java - 将日期从 DD-MMM-YYYY 重新格式化为 YYYYDDMM 或 YYYYMMDD

r - 使用 R 比较日期

Javascript 设置FullYear

mysql - SQL硬查询: events between other events

mysql - 在sql中添加一天到一周

sql - 为什么 SQL ANSI-92 标准没有比 ANSI-89 更好地被采用?

oracle - 如何编译 ORACLE 触发器

sql - 如何转换时间戳的时区以便在 Oracle DB 中进行比较?