在时间段内从多个中选择1个记录

时间:2016-10-12 02:18:26

标签: sql sql-server sql-server-2008 sql-server-2012

我正在尝试选择记录,如果有重叠日期我只有1条记录。我环顾四周,发现问题很接近但无法让他们为我遇到的问题而工作。如果你能帮助我,我会非常感激。

问题是会员可以使用有效日期和结束日期进行多次访问。没有重叠时间可以注册。如果有相同生效日期的重叠时间,我将如何只有1条记录?

我尝试了最大的EndDate等..但是没有用。此外,对于具有相同TIN和日期的1个成员,我可以拥有2条以上的记录。因此需要将MIN / MAX日期作为该时间段的一个记录。 数据:

MEMBER - TIN - EffectiveDate - EndDate
12345   4567   2016-11-18      2016-11-19 --dont want this record
12345   4567   2016-11-18      2017-11-20 --good
12345   5678   2016-11-18      2016-12-30 --good, different TIN

    Select t1.MEMBER, t1.TIN, t1.EFF_DT
    , Case When (select t2.MEMBER = t1.MEMBER and t1.Eff_DT = t2.END_DT 
                 THEN t2.END_DT ELSE t1.END_DT
                 END AS END_DT
                )t2
    FROM Table_A t1
    WHERE t1.MEMBER = t2.MEMBER
    order by t1.MEMBER

希望我能从我的尝试中获得正确的代码。

4 个答案:

答案 0 :(得分:2)

我想这就是你想要的?

SELECT *
FROM
(
    SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY MEMBER, TIN, EFFECTIVE_DATE 
                                          ORDER BY END_DATE DESC)
    FROM   yourtable
) d
where d.RN = 1

如果没有,请告诉我们您的预期结果

答案 1 :(得分:0)

非常常见的查询挑战。看看这篇文章:

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

你可以尝试:

select t1.*
from (
   select MEMBER, TIN, MIN(EffectiveDate) AS MinDate, MAX(EndDate) AS MaxDate
   from table_name group by MEMBER, TIN
) as t1 inner join table_name as t2
    on t1.MEMBER = t2.MEMBER and t1.TIN = t2.TIN;

答案 2 :(得分:0)

我想你可以使用上面的解决方案。您能提供您尝试过的查询吗?您应该能够执行以下操作:

SELECT Member, TIN, MAX(EndDate) as endDate
FROM table_name 
GROUP BY Member, TIN

答案 3 :(得分:0)

试试这个。

SELECT t.member, t.tin, t.effectivedate, t.enddate 
FROM TABLE_A t 
GROUP BY t.tin, t.member, t.enddate 
HAVING t.enddate = 
                  (
                  SELECT MAX(tt.enddate)
                  FROM TABLE_A tt
                  WHERE t.member = tt.member
                  AND t.tin = tt.tin
                  )