Возвращает уникальную запись из таблицы MSSQL, дата которой меньше или равна текущей дате - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть таблица 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', другие записи, дата которых меньше или равна сегодняшней дате, принадлежат другому DeptNo.

Из данной записи таблицы есть 4 разных EMPNO, имеющих DEPTNO =1 это (J000012, J000016, J000039, J000040).Если необходимо выполнить запрос, чтобы отобразить его уникальную запись, в которой EFFECTIVEDATE <= GETDATE () ниже приведены результаты: </p>

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. </p>

RECNO   EMPNO   DEPTNO  EFFECTIVEDATE
7313    J000016 1       2018-09-09
8912    J000039 1       2018-09-11

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Я бы тебе 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
0 голосов
/ 12 сентября 2018

Вам необходимо сгруппировать по номеру сотрудника и номеру отдела.Нечто подобное должно сделать это.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...