2013-12-17 45 views
1

这里是我的问题,我有一个表格(在一个Excel表格中,并使用Microsoft.ACE.OLEDB.12.0连接)和各种列,用于跟踪RF读卡器中的进/出卡刷卡下面的格式...提高性能的SQL

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 

注意第一时间和上次出时间的原始数据,同样首先来自同一列门名和最后门名

我有这个工作,但不表示我认为... 目前,我正在写一个SQL,从源表中获取不同的员工ID。

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宏,所以添加循环,如果块的条件等处理,它使得它有点痛苦地慢得到的数据。

只是想,如果我可以避免这些20000查询,并以某种方式只有一个查询所有这些提取,我认为它会更快。任何想法如何我可以通过在一个SQL中作为输出而不是20000个查询来减少逻辑? 仅供参考,我尝试使用JOIN的但不知何故,我没有得到它:(

+0

正在使用哪个数据库引擎来处理查询? –

回答

0

查询与动态列:

SELECT E.EMP_ID, 
(SELECT MIN(SWIPE_TIME) FROM SWIPES WHERE EMP_ID = E.EMP_ID AND DOOR_NAME LIKE '%IN%') AS TIME_IN, 
(SELECT DOOR_NAME FROM SWIPES WHERE EMP_ID = E.EMP_ID AND SWIPE_TIME = TIME_IN) AS DOOR_IN, 
(SELECT MAX(SWIPE_TIME) FROM SWIPES WHERE EMP_ID = E.EMP_ID AND DOOR_NAME LIKE '%OUT%') AS TIME_OUT, 
(SELECT DOOR_NAME FROM SWIPES WHERE EMP_ID = E.EMP_ID AND SWIPE_TIME = TIME_OUT) AS DOOR_IN, 
FROM SWIPES E 
GROUP BY E.EMP_ID; 

查询,而不动态列:

SELECT E.EMP_ID, 
(SELECT MIN(SWIPE_TIME) FROM SWIPES WHERE EMP_ID = E.EMP_ID AND DOOR_NAME LIKE '%IN%') AS TIME_IN, 
(SELECT DOOR_NAME FROM SWIPES WHERE EMP_ID = E.EMP_ID AND SWIPE_TIME = 
    (SELECT MIN(SWIPE_TIME) FROM SWIPES WHERE EMP_ID = E.EMP_ID AND DOOR_NAME LIKE '%IN%') 
) AS DOOR_IN, 
(SELECT MAX(SWIPE_TIME) FROM SWIPES WHERE EMP_ID = E.EMP_ID AND DOOR_NAME LIKE '%OUT%') AS TIME_OUT, 

(SELECT DOOR_NAME FROM SWIPES WHERE EMP_ID = E.EMP_ID AND SWIPE_TIME = 
    (SELECT MAX(SWIPE_TIME) FROM SWIPES WHERE EMP_ID = E.EMP_ID AND DOOR_NAME LIKE '%OUT%') 

) AS DOOR_OUT 
FROM SWIPES E 
GROUP BY E.EMP_ID; 

我已经更新了查询作为根据我们的讨论

+0

好的,在这里我有两个逻辑数据要挑选 - 1)第一个时间对应于具有'%IN'的位置2)最后一次与'%OUT'位置对应的时间......我如何通过您的查询来实现此目的? – user3109629

+0

有一个问题:员工是否有时间比时间少? –

+0

是的,想象一下,管理人员想要过滤特定时间段(例如下午1点到下午2点)的记录的情况,在这种情况下,您可能会看到OUT比IN更早刷新(例如他出去抽烟;)) – user3109629