SQL Server: найдите последнюю дату вступления в силу для Company / DeptID - PullRequest
0 голосов
/ 26 июня 2018

У нас есть таблица DeptID, в которой есть несколько записей на одну компанию / deptID / action. Как я могу получить список, который включает только самую последнюю дату действия для компании / deptID, независимо от действия? Я хотел бы показать эти и другие столбцы в записи с запросом.

 Co#   DeptID  Action  Eff Date
 ---   ------  ------  --------
 01    12      Closed  03/22/2018 
 01    24      Closed  03/03/2014 
 01    24      Open    07/01/2010
 01    365     Closed  01/01/2008
 01    365     Open    05/01/2010

Этот SQL-код близок, но я не могу отобразить в нем только последнюю дату вступления в силу действия. Если я удалю действие, в нем будет указана последняя дата вступления в силу компании / deptID, но мне нужно знать, к какому действию оно относится - открыть или закрыть?

select distinct 
    loc.CompanyNumber, loc.DeptID, loc.Action, 
    max(loc.effdate) over (partition by companynumber, deptid) as LocmaxDate
from 
    [dbo].[LocationsOpenClosed] as loc

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете использовать CTE (Common Table Expression) в сочетании с Rownumber () следующим образом:

; with 
cte as 
(select loc.CompanyNumber
    , loc.DeptId
    , loc.Action
    , loc. EffDate
    , RowNumber() over (partition by loc.CompanyNumber, loc.DeptId order by loc.EffDate desc) as RN
from    [dbo].[LocationsOpenClosed] as loc
) 
select  cte.CompanyNumber
    , cte.DeptId
    , cte.Action
    , cte.EffDate
from    cte
where   1 = 1
    and cte.RN = 1
0 голосов
/ 26 июня 2018

Вы можете использовать subquery:

select loc.*
from [dbo].[LocationsOpenClosed] as loc
where effdate = (select max(loc1.effdate) 
                 from [dbo].[LocationsOpenClosed] as loc1
                 where loc1.companynumber = loc.companynumber 
                       loc1.deptid = loc.deptid
                 );

Однако я бы также предложил использовать функцию ранжирования:

select *
from (select *, 
             row_number() over (partition by companynumber, deptid order by effdate desc) as seq
      from [dbo].[LocationsOpenClosed]
     ) loc
where seq = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...