SQL提高性能

SQL提高性能,sql,performance,date,time,oledb,Sql,Performance,Date,Time,Oledb,这是我的问题,我有一个表格(在excel表格中,并使用Microsoft.ACE.OLEDB.12.0将其连接起来),其中包含各种列,这些列以以下格式跟踪射频卡读卡器的输入/输出刷卡 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, Doo

这是我的问题,我有一个表格(在excel表格中,并使用Microsoft.ACE.OLEDB.12.0将其连接起来),其中包含各种列,这些列以以下格式跟踪射频卡读卡器的输入/输出刷卡

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

我有这个工作,但没有性能,我想。。。 目前,我正在编写一个SQL,它从源表中获取不同的雇员Id

SELECT DISTINCT [Employee Number] 
FROM [Sheet1$]
然后,我启动两个单独的查询以获取excel中的first-in-time和first-in-door名称存储,并启动另一个last-out和last-out-door查询

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 
选择*
从[sheet1$]
其中([employee number]='”&Trim(rst.Fields(0.Value)&“)
和(类似于“%IN%”的位置)
及(
[sheet1$].[time Occessed]>='“&格式(开始时间,“hh:mm:ss”)&”
和[sheet1$].[time Occessed]='“&格式(startTime,“hh:mm:ss”)&”

和[sheet1$].[time Occessed]使用动态列进行查询:

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;
不带动态列的查询:

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;

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

使用哪个数据库引擎处理查询?好的,这里我有两个逻辑数据要选择-1)第一个时间对应于位置“%in”2)最后一个时间对应于位置“%out”。。。。我如何通过您的查询实现这一点?一个问题:员工的外出时间是否可能比实际时间短?是的,想象一下这样一种情况:管理员想要在特定时间段(比如下午1点到2点)过滤记录,在这种情况下,您可能会看到外出刷卡比进来刷卡更早(比如他出去抽烟;))我修改了查询。请检查是否有效。但是需要更改列名和表名。谢谢Darshan,它至少给了我一些字符串来考虑。但是…我尝试使用您的查询,它抱怨“参数太少”。。。我怀疑这是因为我们动态创建了[TIME_IN]和[TIME_OUT]列。如果在筛选位置时将[TIME_IN]和[TIME_OUT]替换为一个值,则会触发一个查询,但在使用[TIME_IN]和[TIME_OUT]时会发出抱怨。。。。。有什么建议吗?