【问题标题】:SQL Server 2008 query to select correct record based on multiple rulesSQL Server 2008 查询以根据多个规则选择正确的记录
【发布时间】:2013-11-22 06:00:03
【问题描述】:

我在 SQL Server 2008 中有这样的表:

Company_Refno CompanyID   IsActive   StartDate   EndDate

100                              1 是 2000 年 2 月 10 日 2000 年 2 月 11 日
100 2 是 2000 年 2 月 10 日 空值
100 3 ñ 2000 年 3 月 10 日 2000 年 2 月 11 日
100 4 ñ 2000 年 3 月 10 日 2000 年 2 月 11 日
101 5 是 1998 年 5 月 5 日 2008 年 6 月 7 日
101 6 是 1998 年 2 月 2 日 2008 年 6 月 7 日
102 7 是 2007 年 11 月 11 日 2010 年 12 月 12 日
102 7 是 2007 年 11 月 11 日 2010 年 12 月 12 日

我的要求是:

a) 对于给定的 Company_Refno,至少取 1 个活动 ID(即 IsActive = Y),然后取那个
b) 如果一家公司有超过 1 个活动 ID,但只有 1 个打开记录(即结束日期为空),则采用该
c) 如果公司有多个活动记录,有多个结束日期,则取最早的结束日期记录
d) 如果结束日期相同,则取最早的开始日期
e) 如果开始日期相同,则取前 1

因此,在此示例中,对于 Company_Refno 100,我将选择 ID 2(因为它处于活动状态且结束日期为 NULL),
将选择 RefNo 101,ID 6(活动,最早开始日期), RefNo 102, ID 7 (top 1) 将被选中(因为开始和结束日期相同)

谁能帮助我如何使用 SQL Query 实现这一目标?

非常感谢。

【问题讨论】:

    标签: sql-server-2008


    【解决方案1】:

    我正在尝试使用 row_number() 函数解决它

    select * from 
    (
    SELECT *, row_number() OVER (PARTITION BY COMPANY_REFNO ORDER BY 
        case when isnull(iSaCTIVE,'y') = 'Y' then 1 when IsActive !='n' then 2 end asc,     
          isnull(EndDate,'31-dec-9999') desc, StartDate asc)       
        AS RANK_NO FROM
    MyTable
    ) AA
    where rank_no = 1 
    

    但是,我欢迎人们提供其他解决方案!

    【讨论】:

      【解决方案2】:

      您只需要对记录进行排序并获得前1名:

      select top 1 Company_Refno, CompanyID, IsActive, StartDate, EndDate
      from mytable
      where Company_Refno = 100 -- replace that with a parameter
      and IsActive = 'Y' -- condition a)
      order by
          case when EndDate is null then 0 else 1 end, -- condition b)
          EndDate, -- condition c)
          StartDate -- condition d)
      

      【讨论】:

      • 我想要每个 Company_Refno 的所有有效 ID 记录的结果,而不仅仅是一个 Company_RefNo 或前 1 条记录。
      • 好的,在这种情况下,我认为我不会想出比您的解决方案更好的方法。我开始朝同一个方向走。干得好。
      • 嗨,这个旧要求有一个新条件!在我的问题的 e) 点中,即如果 startDates 相同,那么我们应该取 Company_RefNo 的最大值(例如,如果公司 refnos 是 100_10、101_10、103_10,那么如果以上所有 3 个的 startdates 和 enddates 都相同,则必须选择 103_10 记录记录)..有什么答案吗?谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多