【发布时间】:2014-01-04 20:08:47
【问题描述】:
这是我的问题,我有一个表格(在 Excel 表中,并使用 Microsoft.ACE.OLEDB.12.0 连接它),其中包含以下列格式跟踪来自 RF 读卡器的输入/输出卡刷卡的各种列。 ..
Date, Time Occurred, Employee Number, Employee Name, Location
2013-12-20, 11:10:23 AM, 123456, Tester, Door001 IN
2013-12-20, 11:21:44 AM, 123456, Tester, Door002 OUT
2013-12-20, 12:00:12 AM, 123456, Tester, Door001 IN
2013-12-20, 01:00:23 PM, 123456, Tester, Door002 IN
2013-12-20, 03:40:43 PM, 123456, Tester, Door001 OUT
2013-12-20, 05:00:58 PM, 123456, Tester, Door004 IN
2013-12-20, 05:50:02 PM, 123456, Tester, Door001 OUT
2013-12-20, 05:10:00 PM, 123456, Tester, Door002 OUT
2013-12-20, 11:00:01 PM, 123456, Tester, Door001 IN
2013-12-20, 09:10:23 AM, 789012, Developer, Door001 IN
2013-12-20, 10:00:44 AM, 789012, Developer, Door002 OUT
2013-12-20, 10:01:12 AM, 789012, Developer, Door003 IN
2013-12-20, 11:00:23 AM, 789012, Developer, Door004 OUT
2013-12-20, 02:40:43 PM, 789012, Developer, Door005 IN
2013-12-20, 01:00:58 PM, 789012, Developer, Door006 OUT
2013-12-20, 06:50:02 PM, 789012, Developer, Door007 IN
2013-12-20, 08:00:00 PM, 789012, Developer, Door008 IN
2013-12-20, 09:00:01 PM, 789012, Developer, Door009 OUT
我想要以下格式的输出:
Date,Employee Id, Employee Name, First In Time, First In Door Name, Last out time, Last Out Door Name
2013-12-20, 123456, Tester, 12:00:12 AM, Door001 IN, 11:00:01 PM, Door001 OUT
2013-12-20, 789012, Developer, 9:10:23 AM, Door001 IN, 9:00:01 PM, Door009 OUT
请注意,First In Time 和 Last Out 时间来自原始数据中的同一列,First In Door Name 和 Last Out Door Name 类似
我有这个工作,但我认为没有性能...... 目前,我正在编写一个从源表中获取不同员工 ID 的 SQL。
SELECT DISTINCT [Employee Number]
FROM [Sheet1$]
然后我启动两个单独的查询以获取 Excel 中的第一个时间和第一个门名称存储,并启动另一个查询最后一个和最后一个门。
SELECT *
FROM [sheet1$]
WHERE ( [employee number] = '" & Trim(rst.Fields(0).Value) & "' )
AND ( location LIKE '% IN%' )
AND (
[sheet1$].[time occurred] >= '" & Format(startTime, "hh:mm:ss") & "'
AND [sheet1$].[time occurred] <= '" & Format(endTime, "hh:mm:ss") & "' )
ORDER BY [time occurred] ASC
SELECT *
FROM [sheet1$]
WHERE ( [employee number] = '" & Trim(rst.Fields(0).Value) & "' )
AND ( location LIKE '% OUT%' )
AND (
[sheet1$].[time occurred] >= '" & Format(startTime, "hh:mm:ss") & "'
AND [sheet1$].[time occurred] <= '" & Format(endTime, "hh:mm:ss") & "' )
ORDER BY [time occurred] DESC
对于给定的时间过滤器,为了获得“时间第一/门”,我使用 ASC 排序,对于“最后出/门”,我使用 ASC/DESC 排序并从结果中提取第一行。问题是在典型的一天,我可以在大楼里看到大约 10000 名唯一员工,因此为每个员工编号触发两个查询(因此 20000 个查询)需要很长时间。更糟糕的是,我正在编写这是一个 VB 宏,因此添加循环、if 块条件等以进行处理,这使得获取数据的速度有点慢。
只是想如果我可以避免这 20000 个查询并且以某种方式对所有这些提取只有一个查询,我认为它必须更快。有什么想法可以通过在一个 SQL 中作为输出而不是 20000 个查询来减少逻辑吗? 仅供参考,我尝试使用 JOIN,但不知何故我没有得到它:(
【问题讨论】:
-
使用哪个数据库引擎来处理查询?
标签: sql performance date time oledb