我试图根据最大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
我一直试图弄清楚如何做到这一点,但没有太多运气。任何帮助将非常感激。感谢
答案 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 );