Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление повторов в таблице  [new]
M_mouse
Member

Откуда:
Сообщений: 27
День добрый!

Помогите разобраться с запросом.
Необходимо оставить только те записи, у которых значение с самым ранним штампом времени. Пример:

ИД / Дата / Показание
1 /2012-01-22 00:23:02.000 /50
2 /2012-01-22 00:31:31.000 /50
3 /2012-01-22 00:32:32.000 /55
4 /2012-01-22 00:35:24.000 /50
5 /2012-01-22 00:40:01.000 /55
6 /2012-01-22 00:40:25.000 /55
7 /2012-01-22 00:40:49.000 /55
8 /2012-01-22 00:41:36.000 /60
9 /2012-01-22 00:42:33.000 /55
10 /2012-01-22 00:42:53.000 /55
11 /2012-01-22 00:43:09.000 /55
12 /2012-01-22 00:43:28.000 /50
13 /2012-01-22 00:44:55.000 /55


Должно получиться:
ИД /Дата /Показание
1 /2012-01-22 00:23:02.000 /50
3 /2012-01-22 00:32:32.000 /55
4 /2012-01-22 00:35:24.000 /50
5 /2012-01-22 00:40:01.000 /55
8 /2012-01-22 00:41:36.000 /60
9 /2012-01-22 00:42:33.000 /55
12 /2012-01-22 00:43:28.000 /50
13 /2012-01-22 00:44:55.000 /55


+Если между разницей показаний менее 5 секунд - считаем, что был непрерывный отрезок времени.
Данную таблицу получаю следующим запросом:
select dateIndicates,Indicates from SensorIndicates

Заранее спасибо!
12 май 12, 13:57    [12542212]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
M_mouse,
declare kur cursor for select * from tTest

declare @id int
declare @date datetime
declare @val int

open kur

declare @tTemp table (id int, date datetime, val int)
declare @tResult table (id int, date datetime, val int)

fetch next from kur into @id, @date, @val
insert into @tTemp values (@id, @date, @val)

WHILE @@FETCH_STATUS = 0
 begin
    fetch next from kur into @id, @date, @val
    if @val = (select top 1 val from @tTemp) insert into @tTemp values (@id, @date, @val)
    else
      begin
        insert into @tResult 
        select top 1 id, date, val 
        from @tTemp 
        where date = (select min(date) from @tTemp)
        delete from @tTemp 
        insert into @tTemp values (@id, @date, @val)
      end 

end
        insert into @tResult
        select top 1 id, date, val 
        from @tTemp 
        where date = (select min(date) from @tTemp)
        delete from @tTemp 
        insert into @tTemp values (@id, @date, @val)

close kur

select * from @tResult

DEALLOCATE kur


tTest - таблица с исх данными
12 май 12, 15:16    [12542796]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
M_mouse
Member

Откуда:
Сообщений: 27
"tTest - таблица с исх данными"
tTemp?
12 май 12, 15:23    [12542863]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
M_mouse
"tTest - таблица с исх данными"
tTemp?


таблица - переменная, используется независимо от Ваших наименований.
нужно только мою строку
declare kur cursor for select * from tTest

заменить на вашу, учитывая ваши данные
declare kur cursor for 
select ваше_поле_ID
        ,ваше_поле_Датавремя
        ,ваше_поле_показание
from ваша_таблица
12 май 12, 15:30    [12542931]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
так сегодня же уже было решение подобной задачи
12 май 12, 15:32    [12542944]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
Мистер Хенки
так сегодня же уже было решение подобной задачи


Решелие элегантнее?
а можно ссылочку посмотреть как?
12 май 12, 15:34    [12542959]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
M_mouse
Member

Откуда:
Сообщений: 27
Да?я искала, не нашла. Будьте добры ссылку. Спасибо:)
12 май 12, 15:43    [12543032]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
M_mouse
Да?я искала, не нашла. Будьте добры ссылку. Спасибо:)

По смыслу то же самое
тынц
только надо доделать под твою задачу
12 май 12, 15:44    [12543043]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
можно кажись проще
select
	t1.*
from
	Mytable t1
Left join Mytable t2 On t2.ID + 1 = t1.ID 
where
	t2.ID <> t1.ID



автор
+Если между разницей показаний менее 5 секунд - считаем, что был непрерывный отрезок времени

только вот это не понятно и тогда код не сработает
12 май 12, 16:06    [12543230]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
declare @t table (id int, dt datetime, v int);

insert into @t
values
 (1, '20120122 00:23:02.000', 50),
 (2, '20120122 00:31:31.000', 50),
 (3, '20120122 00:32:32.000', 55),
 (4, '20120122 00:35:24.000', 50),
 (5, '20120122 00:40:01.000', 55),
 (6, '20120122 00:40:25.000', 55),
 (7, '20120122 00:40:49.000', 55),
 (8, '20120122 00:41:36.000', 60),
 (9, '20120122 00:42:33.000', 55),
 (10, '20120122 00:42:53.000', 55),
 (11, '20120122 00:43:09.000', 55),
 (12, '20120122 00:43:28.000', 50),
 (13, '20120122 00:44:55.000', 55);

with t as
(
 select
  id, dt, v,
  row_number() over (order by id) as n1,
  row_number() over (partition by v order by id) as n2
 from
  @t
),
x as
(
 select
  id, row_number() over (partition by n1 - n2 order by id) as n
 from
  t
)
delete from x where n > 1;

select * from @t order by id;
12 май 12, 16:06    [12543231]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
invm
declare @t table (id int, dt datetime, v int);

insert into @t
values
 (1, '20120122 00:23:02.000', 50),
 (2, '20120122 00:31:31.000', 50),
 (3, '20120122 00:32:32.000', 55),
 (4, '20120122 00:35:24.000', 50),
 (5, '20120122 00:40:01.000', 55),
 (6, '20120122 00:40:25.000', 55),
 (7, '20120122 00:40:49.000', 55),
 (8, '20120122 00:41:36.000', 60),
 (9, '20120122 00:42:33.000', 55),
 (10, '20120122 00:42:53.000', 55),
 (11, '20120122 00:43:09.000', 55),
 (12, '20120122 00:43:28.000', 50),
 (13, '20120122 00:44:55.000', 55);

with t as
(
 select
  id, dt, v,
  row_number() over (order by id) as n1,
  row_number() over (partition by v order by id) as n2
 from
  @t
),
x as
(
 select
  id, row_number() over (partition by n1 - n2 order by id) as n
 from
  t
)
delete from x where n > 1;

select * from @t order by id;


Здорово, но чо - то не опнятно.
Напишите пожалуйста пару слов по поводу конструкций, если не сложно

  row_number() over (order by id) as n1,
  row_number() over (partition by v order by id) as n2
12 май 12, 16:18    [12543351]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
is_me
Напишите пожалуйста пару слов по поводу конструкций, если не сложно

надеюсь invm на меня не обидется

row_number
12 май 12, 16:39    [12543509]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
M_mouse
Member

Откуда:
Сообщений: 27
Спасибо всем!

Помогло вот это:
select t1.id,t1.Date,t1.Indicates
from dbo.t1 t1
Left join dbo.t2 t2 On t2.rownumber = t1.rownumber + 1
where t1.ID_sensor='6'
and t1.indicates <> t2.indicates
14 май 12, 10:24    [12548257]     Ответить | Цитировать Сообщить модератору
 Re: Удаление повторов в таблице  [new]
M_mouse
Member

Откуда:
Сообщений: 27
Да, и пронумировала строки нормально Rownumber()-ом, был косяк в ID, из-за этого не работало как надо
14 май 12, 10:25    [12548261]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить