我有一个表名Att。它有2列:EmpID和Date。 日期列包含员工在场的所有日期。 我需要写一个查询来查找是否有任何员工持续缺席超过10天。
EmpID | Date
101 | 1/1/2012
101 | 2/1/2012
101 | 7/1/2012
101 | 18/1/2012
101 | 21/1/2012
101 | 25/1/2012
101 | 30/1/2012
102 | 1/1/2012
102 | 2/1/2012
102 | 5/1/2012
102 | 9/1/2012
102 | 14/1/2012
102 | 19/1/2012
102 | 24/1/2012
102 | 25/1/2012
102 | 28/1/2012
102 | 29/1/2012
102 | 30/1/2012
结果应该在这101。 怎么做到这一点?请帮忙。
答案 0 :(得分:3)
如果您使用的是SQL Server 2012
,则可以使用LEAD
分析功能
WITH recordList
AS
(
SELECT EmpID, Date FromDate,
LEAD(Date) OVER (PARTITION BY EmpID ORDER BY Date ASC) ToDate
FROM tableName
)
SELECT DISTINCT EmpID
FROM recordList
WHERE DATEDIFF(d, FromDate ,ToDate) >= 10
其他链接
更新1
WITH firstList
AS
(
SELECT EmpID, Date,
ROW_NUMBER() OVER (PARTITION BY EmpID ORDER BY Date ASC) RN
FROM tableName
)
SELECT DISTINCT a.EmpID
FROM firstList a
INNER JOIN firstList b
ON a.RN + 1 = b.RN
WHERE DATEDIFF (d, a.Date , b.Date ) >= 10
答案 1 :(得分:1)
您想要使用子查询。像
这样的东西select * from Att a1
where day(a1.date)-10 > all
(select day(a2.date) from Att a2 where a2.empid = a1.empid and a2.date < a1.date)
我们的想法是,对于相同的EmpID,我们选择一行的日期,即使我们减去10天,仍然大于之前按时间顺序排列的所有行的日期。
day(date)
应该是返回自纪元以来发生的天数的函数,而不是月中的某天或星期几。或者,您可以执行date-10*ticksinday
之类的操作。无论你做什么都取决于你的SQL风格:)
一旦这对你有意义,就实施它。
答案 2 :(得分:1)
使用OUTER APPLY和EXISTS
的另一个选项SELECT t1.[EmpID], t1.[Date], o.[EmpID], o.[Date],
DATEDIFF(d, o.[Date], t1.[Date]) AS diff
FROM TableName t1
OUTER APPLY (
SELECT t2.[EmpID], t2.[Date]
FROM TableName t2
WHERE EXISTS (
SELECT 1
FROM TableName t3
WHERE t1.[Date] > t3.[Date]
AND t1.EmpID = t2.EmpID
HAVING MAX(t3.[Date]) = t2.[Date]
)
) o
WHERE DATEDIFF(d, o.[Date], t1.[Date]) >= 10
SQLFiddle上的演示