T-SQL仅返回状态类别已从先前状态更改的行

时间:2012-12-04 02:21:41

标签: sql sql-server tsql select

这看起来应该很容易,但我在这方面打成平手。

我的表与此类似(有更多列和多个ID):

EEID (unique)  -  FLSAStatus  -   EffDate
=============     ============    =============
4ABC1        -     A          -    10/01/2010
4ABC1       -      A         -     11/01/2010
4ABC1        -     E          -    11/30/2011
4ABC1       -      O          -    01/01/2012
4ABC1      -       O         -     01/31/2012
4ABC1       -      A          -    11/03/2012
4ABC1       -      A          -    11/13/2012

我想要返回的唯一记录是FLSA状态的最新更改 - 在本案例中是2012年11月3日的记录。

我的问题是我的查询因为我的分组而忽略了“A”状态的第二个实例。我尝试将表拉成A和B并尝试比较日期和状态,但我不断收到语法错误。

例如:

SELECT * from 
(
    select a.eeid, a.flsastatus, a.effdate
    from 
        history a with (nolock), 
        history b with (nolock) 
    where
        a.eeid = b.eeid 
    and a.eeid ='4FM7IK0000K0' 
)
Where 
    a.effdate >= b.beffdate 
and a.flsastatus <> b.flsastatus

显然我是初学者 - 帮助!!请!?

2 个答案:

答案 0 :(得分:0)

如果您正在寻找给定(EEID,FLSAStatus)的最新更改,那么您可以

SELECT A.* 
FROM 
    history A
    JOIN 
    (
        SELECT EEID, FLSAStatus, MAX(EffDate) 'MaxEffDate'
        FROM
            history
        GROUP BY EEID, FLSAStatus
    ) AS B
    ON 
        A.EEID = B.EEID AND 
        A.FLSAStatus = B.FLSAStatus AND 
        A.EffDate = B.MaxEffDate

但如果您对给定EEID的最新更改感兴趣而不担心FLSAStatus,请从上述查询中删除FLSAStatus。

答案 1 :(得分:0)

select min(EffDate)
from history t
where not exists
(select 1 from history where t.FLSAStatus <> FLSAStatus and Effdate > t.Effdate
and t.eeid = eeid)
and t.eeid = 4FM7IK0000K0'