识别在同一个表中为特定日期范围添加的新记录(SQL Server)

时间:2013-01-14 23:32:08

标签: sql sql-server tsql

我正在使用下表(下面包含虚拟数据;实际表也有大约50K记录)

表All_Users

ID, Domain, ReportDate, SamAccountName
1, Win1, 1/7/2013, user1
2, Win1, 1/7/2013, user2
3, Win1, 1/7/2013, user3
4, Win1, 1/14/2013, user1
5, Win1, 1/14/2013, user2
6, Win1, 1/14/2013, user3
7, Win1, 1/21/2013, user1
8, Win1, 1/21/2013, user2
9, Win1, 1/21/2013, user3
10, Win1, 1/21/2013, user4
11, Win1, 1/21/2013, user5

每周,我们都会从AD中获取一个我们上传到SQL Server数据库的摘录(由报告日期列标识)。 目标是能够运行查询以识别为特定日期范围添加的新AD帐户

E.g, identify new AD accounts added from 1/7/2013 through 1/21/2013 

The result should be: 
10, Win1, 1/21/2013, user4
11, Win1, 1/21/2013, user5

目前我的查询如下:

SELECT DISTINCT ReportDate, SamAccountName, Domain, ID
FROM dbo.tbl_All_Users
WHERE (NOT (SamAccountName IN
       (SELECT SamAccountName
        FROM tbl_All_Users
        WHERE (ReportDate = '1/7/2013')))) AND (ReportDate = '1/21/2013') 

这最初是有效的,但随着表的增长 - 查询已经开始超时(出于显而易见的原因 - 它不是有效的一点)。

有效的方法是什么?我尝试过使用内部联接(正如我在本网站上发布的那样),但我似乎无法让它适合我的具体案例。鉴于我缺乏SQL知识,我似乎无法弄明白。

4 个答案:

答案 0 :(得分:1)

在重写查询之前,您应该查看索引的使用。你桌子上有索引吗?如果没有,您可以从ReportDate列的索引开始。

使用该索引可能会获得很大的改进,但随后您可能会有更多机会进行更高级的性能分析。

答案 1 :(得分:1)

SELECT SamAccountName, MIN(ReportDate)                    
FROM tbl_All_Users 
GROUP BY SamAccountName
HAVING MIN(ReportDate) BETWEEN '1/7/2013' AND '1/21/2013'

答案 2 :(得分:1)

您还可以查看查询计划并查看最高成本的位置,还可以建议可以改进特定查询的新索引。数据库调优顾问将更进一步,并建议其他统计数据。请注意,其他索引通常会增加插入和更新的成本。

答案 3 :(得分:0)

问题并不完全清楚 - 您是否希望返回所有用户,除了在这两个范围日期中添加(正如您的查询似乎在做)?

在这种情况下:

;with newlyAdded (select SamAccountName from dbo.tbl_Al_Users
 where ReportDate IN ('2012017', '20130121'))

 select distinct ReportDate, SamAccountName, Domain, ID
 from dbo.tbl_All_Users T
 where not exists (select 1 from newlyAdded nA where nA.SamAccountName = T.SamAccountName)