2013-05-20 66 views
0

我现在有一个查询,返回,例如,以下内容:(你可以认为这是表的结构是什么样子)得到查询摆脱“半重复”

customer_id | start_date | end_date 
1   | 20120101 | 20120401 
2   | 20120402 | 20121231 
1   | 20130101 | 20130401 
1   | 20130101 | 20130330 
2   | 20130331 | 99991231 
2   | 20130402 | 99991231 

有需要考虑的两点:

  1. 客户可以回来,所以对此做一个正常的最大/最小方法是行不通的。
  2. 这实际上是多个服务的概述,有时其中一个开始或结束于不同的日期。 (非常少见,但我需要处理这种情况。)

所以考虑到上述情况,我希望有一个查询将返回1,第2,第3,和第5行。

我的想法&方法,这将是:

  • 如果start_dates相等,显示最大结束日期。 (group by customer_id & start_date,max(end_date))
  • 如果end_dates相等,则显示最小开始日期。

我可以编写一个查询,将做到上面的一个,但我不知道我怎么会能够去这样做他们两个(由CUSTOMER_ID & END_DATE,分(开始)组)与此同时。或者如果完全不同的方法会更好。

SQL Server 2008

谢谢!

+0

。 。你的问题是什么?它是如何实现你的两个重点?或者这是否是一个好方法?对于后者,你实在没有足够的信息。 –

+0

您是否尝试合并重叠的日期范围? (编号示例行将是一个很好的手势,因为您通过文本中的数字引用它们。) – HABO

+0

我的问题现在用粗体显示。我需要一个能够做到这一点的查询。我提出了一些想法和想法,因为我认为这会有所帮助。答案不一定要跟着他们。 – Julian

回答

0

我认为你可以not exists条件做到这一点 -

下面的查询,您可以使用该输出 -

select customer_id , start_date , end_date 
from table_name t_1 
where not exists(
    select 1 from table_name t_2 
    where t_2.customer_id = t_1.customer_id 
    and t_2.start_date = t_1.start_date 
    and t_2.end_date > t_1.end_date) 
and not exists (
    select 1 from table_name t_3 
    where t_3.customer_id = t_1.customer_id 
    and t_3.end_date = t_1.end_date 
    and t_3.start_date<t_1.start_date) 
+0

't_2.start_date = t_2.start_date'? – HABO

+0

哎呀我的坏.. 我会纠正这个问题.. 谢谢@HABO –

+0

谢谢,这符合我的约束,但我想我会用重复链接中给出的更广泛的解决方案。 – Julian