SQL 查询查找访客以及日期时间

标签 sql sql-server mssql-jdbc

我的访客日志表有id、访客、部门、vtime 字段。

    id  |   visitor |           Visittime    |     Department_id
    --------------------------------------------------------------
    1         1           2019-05-07 13:53:50           1 
    2         2           2019-05-07 13:56:54           1
    3         1           2019-05-07 14:54:10           3
    4         2           2019-05-08 13:54:49           1
    5         1           2019-05-08 13:58:15           1 
    6         2           2019-05-08 18:54:30           2
    7         1           2019-05-08 18:54:37           2

我已经有了以下索引

CREATE INDEX Idx_VisitorLog_Visitor_VisitTime_Includes ON VisitorLog 
    (Visitor, VisitTime) INCLUDE (DepartmentId, ID)

从上表 4 可以看出,过滤器是从用户界面、访问者 1 和访问者 2 以及访问开始时间和结束时间传递的。

部门访客 1 和访客 2 的访问时间差在 5 分钟内,需要过滤

输出喊叫

    id  |   visitor |           Visittime    |     Department_id
    --------------------------------------------------------------
    1         1           2019-05-07 13:53:50           1 
    2         2           2019-05-07 13:56:54           1
    4         2           2019-05-08 13:54:49           1
    5         1           2019-05-08 13:58:15           1 

为此,我使用了以下查询,

;with CTE1 AS(
Select id,visitor,Visittime,department_id from visitorlog where visitor=1
)
,CTE2 AS(
Select id,visitor,Visittime,department_id from visitorlog where visitor=2
)
select * from CTE2 V2
Inner join CTE1 V1 on V2.department_id=V1.department_id and DATEDIFF(minute,V2.Visittime,V1.Visittime)between -5 and 5**

上述查询需要太多时间才能给出响应。因为在我的表中,有近 2000 万条记录可用

任何人都可以建议满足我的要求的正确方法吗? 提前致谢

最佳答案

这是根据您上面的附加信息完全修改的答案。

查看上面的数据文件和您想要的结果后,这似乎是提供结果的最简洁的方式。首先,我们需要一个不同的索引:

create index idx_POC_visitorlog on visitorlog
    (visitor, Department_id, Visittime) include(id);

通过这个索引,我们可以将查询限制为仅查询传入的两个 ID。为了模拟这一点,我创建了变量来保存它们的值。此查询返回您正在查找的数据。

DECLARE @Visitor1 int = 1,
    @Visitor2 int = 2

;with t as (
    select Department_id,
        dateadd(minute, -5, visittime) as EarlyTime,
        dateadd(minute, 5, Visittime) as LateTime,
        id
    from visitorlog
    where visitor = @Visitor1
    ),
v as (
    select v.id, 
        t.id as tid
    from visitorlog v
    INNER JOIN t 
        ON v.visitor = @Visitor2
        AND v.Department_id = t.Department_id
        and v.Visittime BETWEEN t.EarlyTime and t.LateTime
    )
SELECT *
FROM visitorlog vl
WHERE ID IN (
    SELECT v.id
    FROM v
    UNION
    SELECT v.tid
    FROM v
    )
ORDER BY visittime;

关于SQL 查询查找访客以及日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59163069/

相关文章:

python - 系统错误: 10054 An existing connection was forcibly closed by the remote host in python

sql - 验证列是否为空值

java - 在 Spring Boot 中进行 JDBC 身份验证时,是否必须使用默认的 'users' 表?

java - 使用 Web 服务的 Android Mssql 服务器

ruby-on-rails-4 - 如何通过 : across servers working 获取 has_many

sql - 关于 1 :1 relationship 的困惑

SQL 比较工具

sql - 在 Case 内嵌入 If 语句

sql - 当 count 达到一个值时获取第一个字段

sql - 这个模型有什么异常吗?