2012-09-27 88 views
0

我遇到查询问题。Tsql group by clause

这是数据(由时间戳顺序):我需要提取不同的值

Data 
    ID Value Timestamp 
    1 0  2001-1-1 
    2 0  2002-1-1 
    3 1  2003-1-1 
    4 1  2004-1-1 
    5 0  2005-1-1 
    6 2  2006-1-1 
    7 2  2007-1-1 
    8 2  2008-1-1 

和日期的第一次出现。这里的例外是我需要将它们分组,只有在该时间段内没有被新值打断。 所以我需要的数据是:

ID Value Timestamp 
1 0  2001-1-1 
3 1  2003-1-1 
5 0  2005-1-1 
6 2  2006-1-1 

我做了一个复杂的查询这项工作,但我肯定有一个简单的方法来做到这一点,它只是不能相信。谁能帮忙?

这就是我开始 - 可能可以与此一起工作。这是一个查询,它应该在值更改时进行定位。

> SELECT * FROM Data d1 join Data d2 ON d1.Timestamp < d2.Timestamp and 
    > d1.Value <> d2.Value 

它可能可以用row_number子句很好地使用,但不能管理它。

+0

向我们展示查询,最好让我们帮您改进它 – stb

+0

SQL-Server的哪个版本? 2012年版本中有许多方法可以在2005或2000版本中选择。 –

回答

0

的样本数据:

declare @T table (ID int, Value int, Timestamp date) 
insert into @T(ID, Value, Timestamp) values 
(1, 0,  '20010101'), 
(2, 0,  '20020101'), 
(3, 1,  '20030101'), 
(4, 1,  '20040101'), 
(5, 0,  '20050101'), 
(6, 2,  '20060101'), 
(7, 2,  '20070101'), 
(8, 2,  '20080101') 

查询:

;With OrderedValues as (
    select *,ROW_NUMBER() OVER (ORDER By TimeStamp) as rn --TODO - specific columns better than * 
    from @T 
), Firsts as (
    select 
     ov1.* --TODO - specific columns better than * 
    from 
     OrderedValues ov1 
      left join 
     OrderedValues ov2 
      on 
       ov1.Value = ov2.Value and 
       ov1.rn = ov2.rn + 1 
    where 
     ov2.ID is null 
) 
select * --TODO - specific columns better than * 
from Firsts 

我没有依靠ID值是连续的,无间隙。如果出现这种情况,可以省略OrderedValues(使用表格和ID代替OrderedValuesrn)。第二个查询只是查找不存在与前一行相同的行的Value

结果:

ID   Value  Timestamp rn 
----------- ----------- ---------- -------------------- 
1   0   2001-01-01 1 
3   1   2003-01-01 3 
5   0   2005-01-01 5 
6   2   2006-01-01 6 

你可以,如果你需要在这个特定的顺序显示结果rn订购。

+0

谢谢Damien!完美地工作! – informerica