数据库为SQL SERVER 2008
现有一表TABLE,记录公司员工的部门变动与职务变动
表结构如下:
ID NAME DEPT(部门) DUTY(职位) TIME(变动时间)
0 TOM IT 员工 2011-4-15
0 TOM IT 项目经理 2013-4-15
0 TOM IT 部门经理 2014-4-15
1 RAY IT 员工 2013-4-15
1 RAY HR 员工 2014-4-15
如何快速查出所有最近两条记录中DURY发生变动的员工的记录
即:
TOM最近两条记录DUTY产生变化,需要被查询出来,而RAY的DUTY没有变化,则不需要
我现在用的语句是:
SELECT * FROM TABLE AS A
WHERE (SELECT TOP 1 DUTY FROM TABLE WHERE ID = A.ID ORDER BY TIME DESC)
<> (SELECT TOP 1 FROM (SELECT TOP 2 DUTY FROM TABLE WHERE ID = A.ID ORDER BY TIME DESC) ORDER BY TIME)
虽然能查询出结果,但是慢,TABLE表一共有12000行记录,执行上述查询要用30秒左右。
不知道有没有快一点的方法?
------解决方案--------------------
WITH a AS (
SELECT * , lag(duty) OVER(ORDER BY id ,time) AS duty1 FROM TABLE AS A )--有限定條件可以這邊先加上
SELECT * FROM a WHERE duty <> duty1
試試看會不會比較快
------解决方案--------------------
SELECT distinct A.NAME ,
A.dept ,
A.TIME ,
A.duty
FROM dbo.TB
CROSS APPLY ( SELECT TOP 2
B.NAME ,
B.dept ,
B.duty ,
B.TIME
FROM TB B
WHERE tb.NAME = B.NAME