根据最大结束日期选择最新的InstanceID

时间:2015-03-16 20:03:46

标签: sql

我试图根据最大DateEnd从表中提取memberinstance。如果它是空的我想拉它,因为它仍然在进行中。我正在使用sql server。

选择memberinstanceid
来自表
由memberid组成 有MAX(ISNULL(date_end,'2099-12-31'))

以上查询对我不起作用。我尝试过不同的实例,并让它返回单独的实例,但不仅仅是具有最大日期的实例
以下是我的表格。

MemberID MemberInstanceID DateStart DateEnd
  2 abc12 2013-01-01 2013-12-31
   4 abc21 2010-01-01 2013-12-31
   2 abc10 2015-01-01 NULL
  4 abc19 2014-01-01 2014-10-31

我希望我的结果看起来像这样

MemberInstanceID
     abc10
     abc19

我一直试图弄清楚如何做到这一点,但没有太多运气。任何帮助将非常感激。感谢

3 个答案:

答案 0 :(得分:0)

SELECT TOP 1 memberinstanceid 
from table 
ORDER BY (CASE WHEN [DateEnd] IS NULL THEN 1 ELSE 0 END) DESC, 
     [DateEnd] DESC

ORDER BY实际上是在创建一个"列"将NULL值排序到顶部,然后对非空的日期进行二级排序。

答案 1 :(得分:0)

我认为您需要以下内容:

select MemberID, MemberInstanceID
from table t
where (
    -- DateEnd is null...
    DateEnd is null
    or (
        -- ...or pick the latest DateEnd for this member...
        DateEnd = (
            select max(DateEnd)
            from table
            where MemberID = t.MemberID
        )
        -- ... and check there's not a NULL entry for DateEnd for this member
        and not exists (
            select 1
            from table
            where MemberID = t.MemberID
            and DateEnd is null
        )
    )
)

这种方法的问题是,如果有多个行匹配每个成员,即具有相同MemberID的多个NULL行,或者具有相同MemberID的相同DateEnd的多个行。

答案 2 :(得分:0)

您有一个良好的开端,但您不需要执行任何明确的分组。你想要的是EndDate为null的行,或者是具有相同MemberID的所有记录的最大值(最新日期)。您还意识到Max无法返回最新的非null日期,因为null(如果存在)必须是最新日期。

select  m.*
from    Members m
where   m.DateEnd   is null
    or  m.DateEnd   =(
        select  Max( IsNull( DateEnd, '9999-12-31' ))
        from    Members
        where   MemberID    = m.MemberID );