0

我有一个查询问题。

这是数据(按时间戳排序):

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 子句来完成,但无法管理它。

4

1 回答 1

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代替OrderedValuesand rn)。第二个查询只是查找没有前一行相同的行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如果您需要此特定顺序的结果,您可以订购。

于 2012-09-27T09:43:16.760 回答