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

Откуда:
Сообщений: 681
Подскажите, пожалуйста, как можно сделать следующее:
Есть таблица:
CREATE TABLE [dbo].[kkk](
[date1] [smalldatetime] NULL,
[firmware] [varchar](8000) NULL,
[count] [int] NULL
) ON [PRIMARY]

GO


И данные:
date1
14.09.2011 11:00 1.113 7 0
14.09.2011 12:00 1.113 8 1
14.09.2011 13:00 1.113 11 3
14.09.2011 11:00 1.037 2 0
14.09.2011 12:00 1.037 7 5
14.09.2011 13:00 1.037 4 -3
14.09.2011 11:00 1.038 1 0
14.09.2011 12:00 1.038 11 10
14.09.2011 13:00 1.038 15 4

Красные данные надо получить
14 сен 11, 13:28    [11275116]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
beaver06,

хм...а алгоритм получения набоно угадать?
14 сен 11, 13:31    [11275150]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
beaver06
Member

Откуда:
Сообщений: 681
SomewhereSomehow
beaver06,

хм...а алгоритм получения набоно угадать?

Из нижнего count вычитать верхний.
Все сгруппировано по date1 и firmware1
14 сен 11, 13:38    [11275227]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
iljy
Member

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

делайте самосоединение каждой записи с предыдущей и считайте ваши изменения.
14 сен 11, 13:39    [11275232]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Версия сервера?
14 сен 11, 13:40    [11275250]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
beaver06
Member

Откуда:
Сообщений: 681
iljy
beaver06,

делайте самосоединение каждой записи с предыдущей и считайте ваши изменения.


Не очень понятно как это делать.
14 сен 11, 13:41    [11275256]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
beaver06,

SELECT k1.*,isnull(k1.tt-a.tt,0) 
FROM kkk k1 
	outer apply	(select top 1 * FROM kkk 
				 WHERE firmware=k1.firmware AND date1 < k1.date1 
				 order BY date1 desc) a
14 сен 11, 13:41    [11275260]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
beaver06
Member

Откуда:
Сообщений: 681
ZOOKABAKODER
Версия сервера?


10.0.4064.0 2008
14 сен 11, 13:42    [11275270]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
beaver06
Member

Откуда:
Сообщений: 681
WarAnt
beaver06,

SELECT k1.*,isnull(k1.tt-a.tt,0) 
FROM kkk k1 
	outer apply	(select top 1 * FROM kkk 
				 WHERE firmware=k1.firmware AND date1 < k1.date1 
				 order BY date1 desc) a


Спасибо, WarAnt!
То что надо
14 сен 11, 13:51    [11275346]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
iljy
Member

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

set dateformat dmy
declare @kkk table(
 [date1] [smalldatetime] NULL,
 [firmware] [varchar](8000) NULL,
 [count] [int] NULL
)

insert @kkk values
('14.09.2011 11:00', '1.113', 7),
('14.09.2011 12:00', '1.113', 8),
('14.09.2011 13:00', '1.113', 11),
('14.09.2011 11:00', '1.037', 2),
('14.09.2011 12:00', '1.037', 7),
('14.09.2011 13:00', '1.037', 4),
('14.09.2011 11:00', '1.038', 1),
('14.09.2011 12:00', '1.038', 11),
('14.09.2011 13:00', '1.038', 15)

;with cte as(
	select *, ROW_NUMBER() over(partition by firmware order by date1) RN from @kkk
)
select t1.date1, t1.firmware, t1.count, ISNULL(t1.count - t2.count,0) diff
from cte t1 left merge join cte t2 on t1.firmware = t2.firmware and t1.RN -1 = t2.RN
14 сен 11, 14:05    [11275451]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
beaver06
Member

Откуда:
Сообщений: 681
iljy
beaver06,

set dateformat dmy
declare @kkk table(
 [date1] [smalldatetime] NULL,
 [firmware] [varchar](8000) NULL,
 [count] [int] NULL
)

insert @kkk values
('14.09.2011 11:00', '1.113', 7),
('14.09.2011 12:00', '1.113', 8),
('14.09.2011 13:00', '1.113', 11),
('14.09.2011 11:00', '1.037', 2),
('14.09.2011 12:00', '1.037', 7),
('14.09.2011 13:00', '1.037', 4),
('14.09.2011 11:00', '1.038', 1),
('14.09.2011 12:00', '1.038', 11),
('14.09.2011 13:00', '1.038', 15)

;with cte as(
	select *, ROW_NUMBER() over(partition by firmware order by date1) RN from @kkk
)
select t1.date1, t1.firmware, t1.count, ISNULL(t1.count - t2.count,0) diff
from cte t1 left merge join cte t2 on t1.firmware = t2.firmware and t1.RN -1 = t2.RN



Спасибо
14 сен 11, 14:22    [11275598]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать изменение за период  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
beaver06,

только учтите, если даты у одного firmware будут одинаковые условие date1 < k1.date1 не сработает, это я к тому что нужен уникальный параметр чтобы всегда правильно выдавало, либо использовать вариант от iljy
14 сен 11, 14:22    [11275599]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить