2010-02-11 89 views
1

我想写一个sql语句,它从我的表返回坏行。我有一张桌子和一排排:sql查询子选择本身混乱

重要|日期|指标
1 | 10/10/08 | SE
1 | 10/11/09 | CB
1 | 10/12/09 | CE
1 | 10/13/09 | TR
2 | 1/1/09 | SE
3 | 10/10/08 | SE
3 | 10/13/09 | CE
3 | 10/15/09 | SL

所以我想要返回的将是所有的行,其中一个键具有CE的指示符,然后我想要的行是完全明确的日期。
EX。我的结果将是:

1 | 10/13/09 | TR
3 | 10/15/09 | SL

我的问题是我无法弄清楚如何使用上面列出的条件自己加入表格。请帮助任何建议。

回答

1

即使一个密钥出现多次CE,它也会给你所有的行。

select t1.* 
from myTable t1 
inner join 
    (select t2.[key], min(t2.date) minDate 
    from myTable t2 
    inner join ( 
     select CE.[key], CE.date  
     from myTable CE 
     where CE.indicator = 'CE' 
    ) as CEs 
    on CEs.[key] = t2.[key] 
    and CEs.date < t2.date 
    group by t2.[key]) t2s 
on t2s.[key] = t1.[key] 
and t1.date = t2s.minDate 
order by 1, 2 
+0

这只有在记录相隔1天时才有效。 – 2010-02-11 21:20:58

+0

@亚当鲁斯你是对的,我改变它 – JBrooks 2010-02-12 02:48:14

+0

这很好地工作 – 2010-02-12 13:44:55

1

大概不是很快,但我的第一个猜测。

select * from table where 'CE' = 
(select top(1) indicator from table 
    t1 where t1.date < table.date and t1.key = table.key order by date desc) 
+0

我认为这只返回每个键的顶部'CE'行。但至少它给了我一些与 – 2010-02-12 13:33:10

+0

一起工作你尝试过运行它吗?它会返回你正在寻找的东西。这比你接受的要快。 – 2010-02-12 23:16:09