我有EmpDept表,该表保留员工分配到不同部门的历史记录。
RECNO EMPNO DEPTNO EFFECTIVEDATE
2051 J000012 1 2011-09-16
7322 J000012 3 2018-09-07
2055 J000016 1 2013-05-16
7312 J000016 3 2018-07-09
7320 J000016 3 2018-09-07
7313 J000016 1 2018-09-09
7316 J000016 1 2018-09-15
7390 J000040 2 2017-05-10
7391 J000040 1 2018-09-09
7392 J000040 5 2018-09-10
8912 J000039 1 2018-09-11
如果今天的日期是“ 2018-09-12”, 参数@DeptNo = 1, 预期输出:
RECNO EMPNO DEPTNO EFFECTIVEDATE
8912 J000039 1 2018-09-11
7313 J000016 1 2018-09-09
因为只有EMPNO = J000039和J000016的有效日期小于或等于'2018-09-12',所以日期小于或等于今天的其他记录属于其他部门编号。
从表的给定记录中,有4个具有DEPTNO = 1的不同EMPNO 这些是(J000012,J000016,J000039,J000040)。 如果必须执行查询以显示其唯一记录,则EFFECTIVEDATE <= GETDATE() 结果如下:
SELECT TOP 1 *
FROM EMPDEPT
WHERE EMPNO='J000012' AND
EFFECTIVEDATE <=GETDATE()
ORDER BY EFFECTIVEDATE DESC
SELECT TOP 1 *
FROM EMPDEPT
WHERE EMPNO='J000016' AND
EFFECTIVEDATE <=GETDATE()
ORDER BY EFFECTIVEDATE DESC
SELECT TOP 1 *
FROM EMPDEPT
WHERE EMPNO='J000039' AND
EFFECTIVEDATE <=GETDATE()
ORDER BY EFFECTIVEDATE DESC
SELECT TOP 1 *
FROM EMPDEPT
WHERE EMPNO='J000040' AND
EFFECTIVEDATE <=GETDATE()
ORDER BY EFFECTIVEDATE DESC
输出分别是:
RECNO EMPNO DEPTNO EFFECTIVEDATE
7322 J000012 3 2018-09-07
RECNO EMPNO DEPTNO EFFECTIVEDATE
7313 J000016 1 2018-09-09
RECNO EMPNO DEPTNO EFFECTIVEDATE
8912 J000039 1 2018-09-11
RECNO EMPNO DEPTNO EFFECTIVEDATE
7392 J000040 5 2018-09-10
基于该结果,回到要求, 下面是输出,因为这些只是属于DEPTNO = 1的记录 哪个EFFECTIVEDATE是<= GETDATE(),其他EMPNO,最近的DEPTNO不等于1。
RECNO EMPNO DEPTNO EFFECTIVEDATE
7313 J000016 1 2018-09-09
8912 J000039 1 2018-09-11
答案 0 :(得分:1)
我会WITH TIES
,并且希望您可以轻松使用窗口功能。...
select top 1 * with ties
from yourTable
where DEPTNO = @DeptNo and EFFECTIVEDATE < getdate()
order by row_number() over (partition by EmpNo order by EFFECTIVEDATE desc)
对于更大的数据集,我将在CTE
;with cte as (
select
*
,RN = row_number() over (partition by EmpNo order by EFFECTIVEDATE desc)
from yourTable
where EFFECTIVEDATE < getdate())
select *
from cte
where RN = 1 And DEPTNO = @DeptNo
答案 1 :(得分:0)
您需要按员工编号和部门编号分组。像这样的事情应该做。
declare @DeptNo as INTEGER
declare @Date as DATE
SET @DeptNo = 1
set @Date = '2018-09-12'
SELECT RECNO, EMPNO, DEPTNO, MAX(EFFECTIVEDATE)
FROM EmpDept
WHERE EFFECTIVEDATE <= @Date
AND DEPTNO = @DeptNo
GROUP BY RECNO, EMPNO, DEPTNO
结果:
2051 J000012 1 2011-09-16
2055 J000016 1 2013-05-16
7313 J000016 1 2018-09-09
8912 J000039 1 2018-09-11
7391 J000040 1 2018-09-09