我在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实现此目的吗?
非常感谢。
答案 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)