SQL Server 2008查询根据多个规则选择正确的记录

时间:2013-11-22 06:00:04

标签: sql-server-2008

我在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   五   ÿ      1998年5月5日      6/7/2008   
  101   6   ÿ      1998年2月2日      6/7/2008   
  102   7   ÿ      2007年11月11日      12/12/2010   
  102   7   ÿ      2007年11月11日      12/12/2010

我的要求是:

a)对于给定的Company_Refno,至少取一个有效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(前1名)(由于开始和结束日期相同)

任何人都可以帮我解决如何使用SQL Query实现此目的吗?

非常感谢。

2 个答案:

答案 0 :(得分: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 

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

答案 1 :(得分:0)

您只需订购记录并获得前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)