从MSSQL表返回唯一日期小于或等于当前日期的唯一记录

时间:2018-09-12 12:43:54

标签: sql sql-server sql-server-2008

我有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

2 个答案:

答案 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
相关问题