【问题标题】:Select most recent InstanceID base on max end date根据最大结束日期选择最新的 InstanceID
【发布时间】:2015-05-19 02:31:16
【问题描述】:

我正在尝试根据最大 DateEnd 从表中提取成员实例。如果它是 Null,我想拉它,因为它仍在进行中。我正在使用 sql 服务器。

选择成员实例 ID
从表
按成员 ID 分组
有 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

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

成员实例ID
abc10
abc19

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

【问题讨论】:

  • 这真的与 Microsoft SQL Server 有关吗?如果不是,请删除 sql-server 标记。一般来说,添加更多背景,以及到目前为止您尝试过的内容。

标签: sql


【解决方案1】:
SELECT TOP 1 memberinstanceid 
from table 
ORDER BY (CASE WHEN [DateEnd] IS NULL THEN 1 ELSE 0 END) DESC, 
     [DateEnd] DESC

ORDER BY 本质上是创建一个“列”来将 NULL 值排序到顶部,然后对不为 null 的日期进行二次排序。

【讨论】:

  • 谢谢。这有效,但只返回一个结果。我正在寻找它以按成员返回结果。
【解决方案2】:

我认为您需要以下内容:

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 行,或者具有相同 DateEnd 的多个行与相同的 MemberID。

【讨论】:

    【解决方案3】:

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

    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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 2019-02-07
      相关资源
      最近更新 更多