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

Откуда:
Сообщений: 35
Добрый день форумчане!!!
нужна ваша помощь!!
ситуация такая:
имеется таблица, в ней надо найти по номеру квартиры разницу значения счетчика и предыдущего значения, соответствующий этому номеру квартиры.

т.е. 7-я строчка в таблице: № квартиры 1, счетчик =18, ищем предыдущее значение 1- й квартиры =12, и показываем разницу, т.е. 6

блин, надеюсь понятно объяснил))

К сообщению приложен файл (табл.xls - 22Kb) cкачать
1 авг 11, 14:53    [11053333]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
ahmae
блин, надеюсь понятно объяснил))


Нет...
1 авг 11, 14:54    [11053351]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ahmae
Member

Откуда:
Сообщений: 35
а что непонятно????
1 авг 11, 15:00    [11053391]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
https://www.sql.ru/forum/actualthread.aspx?tid=127456

Если вы оформите ваш вопрос согласно пунктам 4 и 6, то скорее все вам помогут...
1 авг 11, 15:03    [11053425]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ahmae
Member

Откуда:
Сообщений: 35
SQL server 2008 r2
т.е. нужно написать запрос, который будет считать и отображать разницу между предыдущим значеним и текущим.
я имею такую таблицу:

время № дома №квартиры счетчик
12:00 50 1 12 в 12:00 счетчик показываетв 1-й квартире 12
12:05 50 3 13
12:10 50 2 15
12:15 50 4 18
12:20 50 5 21
12:25 50 1 18 т.е. когда мы подошли к этой строчке в 12:25 в 1 квартире

нужно получить такую:
время № дома № квартиры счетчик
12:00 50 1 12
12:05 50 3 13
12:10 50 2 15
12:15 50 4 18
12:20 50 5 21
12:25 50 1 6 надо, чтобы показывало разницу18-12
1 авг 11, 15:24    [11053614]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ahmae
Member

Откуда:
Сообщений: 35
ahmae
SQL server 2008 r2
т.е. нужно написать запрос, который будет считать и отображать разницу между предыдущим значеним и текущим.
я имею такую таблицу:

время № дома №квартиры счетчик
12:00 50 1 12 в 12:00 счетчик показываетв 1-й квартире 12
12:05 50 3 13
12:10 50 2 15
12:15 50 4 18
12:20 50 5 21
12:25 50 1 18 т.е. когда мы подошли к этой строчке в 12:25 в 1 квартире

нужно получить такую:
время № дома № квартиры счетчик
12:00 50 1 12
12:05 50 3 13
12:10 50 2 15
12:15 50 4 18
12:20 50 5 21
12:25 50 1 6 надо, чтобы показывало разницу18-12
1 авг 11, 15:25    [11053627]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
yado4eg
Member

Откуда:
Сообщений: 202
ahmae,

аналогичная
1 авг 11, 15:32    [11053685]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
_ч_
Member

Откуда:
Сообщений: 1446
ahmae
SQL server 2008 r2
т.е. нужно написать запрос, который будет считать и отображать разницу между предыдущим значеним и текущим.
я имею такую таблицу:

время № дома №квартиры счетчик
12:00 50 1 12 в 12:00 счетчик показываетв 1-й квартире 12
12:05 50 3 13
12:10 50 2 15
12:15 50 4 18
12:20 50 5 21
12:25 50 1 18 т.е. когда мы подошли к этой строчке в 12:25 в 1 квартире

нужно получить такую:
время № дома № квартиры счетчик
12:00 50 1 12
12:05 50 3 13
12:10 50 2 15
12:15 50 4 18
12:20 50 5 21
12:25 50 1 6 надо, чтобы показывало разницу18-12


Наверное что-то вроде того.
declare @t table(t time, num_house int, num_apartment int, val int)

insert into @t
select'12:00', 50, 1, 12
union select '12:05', 50, 3, 13
union select '12:10', 50, 2, 15
union select '12:15', 50, 4, 18
union select '12:20', 50, 5, 21
union select '12:25', 50, 1, 18

update @t 
set 
val = d.diff 
from @t t
inner join (
select t2.val - t1.val as diff, t2.num_apartment, t2.num_house, t2.t from(select row_number() over (partition by num_house, num_apartment order by t) as n, * from @t) t1
left join (select row_number() over (partition by num_house, num_apartment order by t) as n, * from @t) t2 on t2.n-1 = t1.n and t1.t <> t2.t and t1.num_apartment = t2.num_apartment and t1.num_house = t2.num_house)d on d.num_apartment = t.num_apartment and d.num_house = t.num_house and d.t = t.t 

select * from @t

Правда с двумя row_number() (без них не знаю как)
1 авг 11, 15:38    [11053746]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
ahmae,

declare @t table (time datetime, Building int, flat int, Num int)
insert into @t
select '2011-08-01 11:00', 50, 1, 10 union
select '2011-08-01 12:00', 50, 1, 12 union-- в 12:00 счетчик показываетв 1-й квартире 12
select '2011-08-01 12:05', 50, 3, 13 union
select '2011-08-01 12:10', 50, 2, 15 union
select '2011-08-01 12:15', 50, 4, 18 union
select '2011-08-01 12:20', 50, 5, 21 union
select '2011-08-01 12:25', 50, 1, 18

select a.time,a.Building,a.flat,a.Num-ISNULL(t3.num,0) as Num
from
(select t1.time,t1.Building,t1.flat,t1.Num,MAX(t2.time) as lstTime
from @t as t1 left join @t as t2
on t2.time<t1.time and t1.Building=t2.Building and t1.flat=t2.flat
group by t1.time,t1.Building,t1.flat,t1.Num) as a
left join @t as t3 on a.Building=t3.Building and a.flat=t3.flat and a.lstTime=t3.time
1 авг 11, 15:42    [11053785]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ahmae
Member

Откуда:
Сообщений: 35
мне же надо найти разницу значения поля "счетчик" по номеру квартиры
1 авг 11, 15:45    [11053808]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
ahmae,

А что не так? Поле [Num] - это показания счетчика.
1 авг 11, 15:50    [11053852]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ahmae
Member

Откуда:
Сообщений: 35
ilyaBS,

да все так, просто эта таблица будет постоянно расти!https://www.sql.ru/forum/images/smoke.gif и не вариант будет постоянно дату добавлять
1 авг 11, 15:55    [11053903]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
ahmae
да все так, просто эта таблица будет постоянно расти!https://www.sql.ru/forum/images/smoke.gif и не вариант будет постоянно дату добавлять


Может так:

declare @t table (time char(5), Building int, flat int, Num int)
insert into @t
select '11:00', 50, 1, 10 union
select '12:00', 50, 1, 12 union-- в 12:00 счетчик показываетв 1-й квартире 12
select '12:05', 50, 3, 13 union
select '12:10', 50, 2, 15 union
select '12:15', 50, 4, 18 union
select '12:20', 50, 5, 21 union
select '12:25', 50, 1, 18

select a.time,a.Building,a.flat,a.Num-ISNULL(t3.num,0) as Num
from
(select t1.time,t1.Building,t1.flat,t1.Num,MAX(t2.num) as lstNum
from @t as t1 left join @t as t2
on t2.num<t1.num and t1.Building=t2.Building and t1.flat=t2.flat
group by t1.time,t1.Building,t1.flat,t1.Num) as a
left join @t as t3 on a.Building=t3.Building and a.flat=t3.flat and a.lstNum=t3.Num
1 авг 11, 16:07    [11054015]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SET NOCOUNT ON;
declare @t table(t time, num_house int, num_apartment int, val int)

insert into @t
select'12:00', 50, 1, 12
union select '12:05', 50, 3, 13
union select '12:10', 50, 2, 15
union select '12:15', 50, 4, 18
union select '12:20', 50, 5, 21
union select '12:25', 50, 1, 18

SELECT t.*, t.val-ISNULL(d.v,0) diff
FROM @t t
OUTER APPLY
(
 SELECT TOP(1) tt.val
 FROM @t tt
 WHERE tt.num_house=t.num_house
   AND tt.num_apartment=t.num_apartment
   AND tt.t<t.t
 ORDER BY tt.t DESC
) d(v)
ORDER BY t.t, t.num_house, t.num_apartment;
1 авг 11, 16:23    [11054178]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ahmae
Member

Откуда:
Сообщений: 35
Работает!!!!
всем огромное спасибо!!!!!!!УРА!!!!
1 авг 11, 16:38    [11054293]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
ahmae
Member

Откуда:
Сообщений: 35
Офигенный форум!!!!Красавцы)
1 авг 11, 16:39    [11054307]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
iap
SET NOCOUNT ON;
declare @t table(t time, num_house int, num_apartment int, val int)

insert into @t
select'12:00', 50, 1, 12
union select '12:05', 50, 3, 13
union select '12:10', 50, 2, 15
union select '12:15', 50, 4, 18
union select '12:20', 50, 5, 21
union select '12:25', 50, 1, 18

SELECT t.*, t.val-ISNULL(d.v,0) diff
FROM @t t
OUTER APPLY
(
 SELECT TOP(1) tt.val
 FROM @t tt
 WHERE tt.num_house=t.num_house
   AND tt.num_apartment=t.num_apartment
   AND tt.t<t.t
 ORDER BY tt.t DESC
) d(v)
ORDER BY t.t, t.num_house, t.num_apartment;

+1
Непонял, но красиво. Сжу - курю.... Спасибо за наглядный пример outer apply.
1 авг 11, 22:12    [11055766]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Вот так, по моему, быстрее:


create table t(t datetime, num_house int, num_apartment int, val int)

insert into t
select'2011-08-01 12:00', 50, 1, 12
union select '2011-08-01 12:05', 50, 3, 13
union select '2011-08-01 12:10', 50, 2, 15
union select '2011-08-01 12:15', 50, 4, 18
union select '2011-08-01 12:20', 50, 5, 21
union select '2011-08-01 12:25', 50, 1, 18
union select '2011-08-01 12:50', 50, 1, 22

with c as (
  select
    row_number() over (partition by num_house, num_apartment order by t) rownum,
    * 
  from
    t
)
select 
  c.*,
  c.val-isnull(d.val,0) diff
from
  c
left join
  c d
on
  d.num_house = c.num_house
  and d.num_apartment = c.num_apartment
  and d.rownum = c.rownum-1
order by
  c.t, 
  c.num_house, 
  c.num_apartment
  
2 авг 11, 19:06    [11061081]     Ответить | Цитировать Сообщить модератору
 Re: поиск разницы предыдущего значения  [new]
alexejs
Member

Откуда:
Сообщений: 147
ahmae
т.е. нужно написать запрос, который будет считать и отображать разницу между предыдущим значеним и текущим.


До кучи - http://blogs.technet.com/b/isv_team/archive/2011/08/03/3444815.aspx
3 авг 11, 14:26    [11064648]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить