Re: Хитрая (?) выборка из MS SQL
От: Goodkov Россия  
Дата: 03.02.10 06:55
Оценка: 36 (1)
Здравствуйте, Odi$$ey, Вы писали:


declare @t TABLE (TimeStamp datetime,Param1 int ,Param2 int)
insert into @t
select '10:21:21',    0,         0 union all
select '10:21:22',    0,         0 union all
select '10:21:23',    1,         0 union all
select '10:21:24',    1,         0 union all
select '10:21:25',    1,         8 union all
select '10:21:26',    0,         0 union all
select '10:21:27',    0,         4 union all
select '10:21:28',    0,         4 union all
select '10:21:29',    2,         4 union all
select '10:21:30',    2,         4 union all
select '10:21:31',    0,         0 union all
select '10:21:32',    0,         0 union all
select '10:21:33',    0,         0 union all
select '10:21:34',    0,         0 union all
select '10:21:35',    0,         0 union all
select '10:21:36',    1,         0 

;with s1 
as
(
    select TimeStamp,Param1,Param2, row_number() over (order by TimeStamp) as rnk
    from @t
)

select ss1.TimeStamp,ss1.Param1,ss1.Param2
from s1 ss1
left join s1 ss2 on ss2.rnk+1=ss1.rnk
where ss1.Param1<>ss2.Param1 or ss1.Param2<>ss2.Param2 or ss2.TimeStamp is null


Нужны индексы.
Re: Хитрая (?) выборка из MS SQL
От: Sinix  
Дата: 03.02.10 06:49
Оценка: 18 (1)
Здравствуйте, Odi$$ey, Вы писали:

OE>из нее надо выбрать только те строки, где меняется Param1 или Param2, они отмечены <<. База — MS SQL 2005/2008. Подскажите ключевые слова как это пооптимальнее изобразить.


1) Написать multi-column aggregate — но тут надо думать.
2) покопаться с ranking functions (кмк бесперспективно)
3) table-valued function с курсором и фильтрацией внутри (увы, харкод структуры данных)

Или, если уникальность времени гарантируется, как-то так (синтаксис 2008го):

    DECLARE @Tbl TABLE (ID int, P1 int NOT NULL, P2 int NOT NULL)
    
    INSERT @Tbl (ID, P1, P2) VALUES
      (1,1,1),
      (4,1,1),
      (7,0,1),
      (8,0,1),
      (9,1,2),
      (10,1,1);
      
    SELECT T1.* FROM @Tbl T1
      WHERE 
        EXISTS (
          SELECT T2.*
          FROM @Tbl T2
            WHERE T2.ID < T1.ID
              AND (T2.P1 <> T1.P1 OR T2.P2 <> T1.P2)
              -- гарантируем, что в T2 - только строка перед T1
              AND NOT EXISTS (SELECT T3.* FROM @Tbl T3 WHERE T3.ID < T1.ID AND T3.ID > T2.ID)
        )
        -- + первая строка
        OR NOT EXISTS (SELECT T4.* FROM @Tbl T4 WHERE T4.ID < T1.ID);
Re: Хитрая (?) выборка из MS SQL
От: _d_m_  
Дата: 03.02.10 07:45
Оценка: 18 (1)
Здравствуйте, Odi$$ey, Вы писали:

OE>из нее надо выбрать только те строки, где меняется Param1 или Param2, они отмечены <<. База — MS SQL 2005/2008. Подскажите ключевые слова как это пооптимальнее изобразить.


Ну я буду очередным хитрецом и отдельное спс Goodkov за предоставленный скрипт генерации исходных данных (что является как-бы минусом топикстартеру).
И еще: на поле TimeStamp надо бы индекс повесить, а то и кластерный.
declare @t TABLE (TimeStamp datetime,Param1 int ,Param2 int)
insert into @t
select '10:21:21',    0,         0 union all
select '10:21:22',    0,         0 union all
select '10:21:23',    1,         0 union all
select '10:21:24',    1,         0 union all
select '10:21:25',    1,         8 union all
select '10:21:26',    0,         0 union all
select '10:21:27',    0,         4 union all
select '10:21:28',    0,         4 union all
select '10:21:29',    2,         4 union all
select '10:21:30',    2,         4 union all
select '10:21:31',    0,         0 union all
select '10:21:32',    0,         0 union all
select '10:21:33',    0,         0 union all
select '10:21:34',    0,         0 union all
select '10:21:35',    0,         0 union all
select '10:21:36',    1,         0 

select
    t1.*
from
    @t t1
        outer apply
    (select top 1
        t2.Param1,
        t2.Param2
    from
        @t t2
    where
        t2.TimeStamp < t1.TimeStamp
    order by
        t2.TimeStamp desc
    ) as Prev
where
    t1.Param1 != Prev.Param1 or
    t1.Param2 != Prev.Param2 or
    Prev.Param1 is null
order by
    TimeStamp
;
Re: Хитрая (?) выборка из MS SQL
От: kvasya  
Дата: 03.02.10 06:47
Оценка: 12 (1)
Здравствуйте, Odi$$ey, Вы писали:

OE>из нее надо выбрать только те строки, где меняется Param1 или Param2, они отмечены <<. База — MS SQL 2005/2008. Подскажите ключевые слова как это пооптимальнее изобразить.


А в чем засада?

declare @demo table ( dt int identity, param1 int, param2 int)

insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 1, 0 )
insert @demo ( param1, param2 ) values( 1, 0 )
insert @demo ( param1, param2 ) values( 1, 8 )
insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 0, 4 )
insert @demo ( param1, param2 ) values( 0, 4 )
insert @demo ( param1, param2 ) values( 2, 4 )
insert @demo ( param1, param2 ) values( 2, 4 )
insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 0, 0 )
insert @demo ( param1, param2 ) values( 1, 0 )

select r.* from @demo r
    left join @demo prev on prev.dt = ( select max(dt) from @demo prevAll where prevAll.dt < r.dt)
    where r.param1 <> prev.param1 or r.param2 <> prev.param2 or prev.dt is null


Или засада в "как бы по эффективней"?
Хитрая (?) выборка из MS SQL
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.02.10 06:19
Оценка:
Есть такая вьюшка:

TimeStamp  Param1  Param2

10:21:21    0         0 <<
10:21:22    0         0
10:21:23    1         0 <<
10:21:24    1         0
10:21:25    1         8 <<
10:21:26    0         0 <<
10:21:27    0         4 <<
10:21:28    0         4
10:21:29    2         4 <<
10:21:30    2         4
10:21:31    0         0 <<
10:21:32    0         0
10:21:33    0         0
10:21:34    0         0
10:21:35    0         0
10:21:36    1         0 <<


из нее надо выбрать только те строки, где меняется Param1 или Param2, они отмечены <<. База — MS SQL 2005/2008. Подскажите ключевые слова как это пооптимальнее изобразить.
Re[2]: Хитрая (?) выборка из MS SQL
От: Sinix  
Дата: 03.02.10 06:52
Оценка:
Здравствуйте, kvasya, Вы писали:

K>А в чем засада?

Ну, или так — что-то я с max протормозил
Re: Хитрая (?) выборка из MS SQL
От: Caracrist https://1pwd.org/
Дата: 03.02.10 07:20
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Есть такая вьюшка:


OE>
OE>TimeStamp  Param1  Param2

OE>10:21:21    0         0 <<
OE>10:21:22    0         0
OE>10:21:23    1         0 <<
OE>10:21:24    1         0
OE>10:21:25    1         8 <<
OE>10:21:26    0         0 <<
OE>10:21:27    0         4 <<
OE>10:21:28    0         4
OE>10:21:29    2         4 <<
OE>10:21:30    2         4
OE>10:21:31    0         0 <<
OE>10:21:32    0         0
OE>10:21:33    0         0
OE>10:21:34    0         0
OE>10:21:35    0         0
OE>10:21:36    1         0 <<
OE>


OE>из нее надо выбрать только те строки, где меняется Param1 или Param2, они отмечены <<. База — MS SQL 2005/2008. Подскажите ключевые слова как это пооптимальнее изобразить.



select top(1) * from tbl
union  
select l.* from tbl as l 
inner join tbl as r 
on l.id = r.id + cast('0:0:01' as datetime)
where l.val1 <> r.val1 or l.val2 <> r.val2
~~~~~
~lol~~
~~~ Single Password Solution
Re: Хитрая (?) выборка из MS SQL
От: avpavlov  
Дата: 03.02.10 07:55
Оценка:
OE>из нее надо выбрать только те строки, где меняется Param1 или Param2, они отмечены <<. База — MS SQL 2005/2008. Подскажите ключевые слова как это пооптимальнее изобразить.

Прямо дежавю у меня

http://www.rsdn.ru/forum/db/3678374.aspx
Автор: avpavlov
Дата: 22.01.10
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.