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

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

Подскажите, пожалуйста, как можно соорудить запрос на вычитание значений строк.
Есть таблица:
TableName TotalSpace collection_time
t1 1129032432 2017-09-19 01:00:02.000
t1 1128545656 2017-09-18 01:00:03.000
t1 1127924784 2017-09-17 01:00:02.000
t1 1126651936 2017-09-15 11:54:01.000
t1 1126651936 2017-09-16 01:00:02.000
t2 1063103176 2017-09-19 01:00:02.000
t2 1063069544 2017-09-18 01:00:03.000
t2 1063058040 2017-09-17 01:00:02.000
t2 1063034144 2017-09-16 01:00:02.000
t2 1063008192 2017-09-15 11:54:01.000


надо подсчитать разницу значений TotalSpace между датами.
19 сен 17, 14:22    [20806125]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание значений строк  [new]
TaPaK
Member

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

LAG
19 сен 17, 14:30    [20806158]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание значений строк  [new]
demind74
Member

Откуда:
Сообщений: 4
beaver06, можно привязать таблицу саму к себе
DECLARE @source table (TableName varchar(50),	TotalSpace int,	collection_time datetime)

INSERT INTO @source (TableName,	TotalSpace,	collection_time)
	VALUES  ('t1',	1129032432,	'2017-09-19T01:00:02.000'),
			('t1',	1128545656,	'2017-09-18T01:00:03.000'),
			('t1',	1127924784,	'2017-09-17T01:00:02.000'),
			('t1',	1126651936,	'2017-09-15T11:54:01.000'),
			('t1',	1126651936,	'2017-09-16T01:00:02.000'),
			('t2',	1063103176,	'2017-09-19T01:00:02.000'),
			('t2',	1063069544,	'2017-09-18T01:00:03.000'),
			('t2',	1063058040,	'2017-09-17T01:00:02.000'),
			('t2',	1063034144,	'2017-09-16T01:00:02.000'),
			('t2',	1063008192,	'2017-09-15T11:54:01.000');

WITH cteXpression (TableName,	TotalSpace,	collection_time, prev_collection_time)
AS
(
SELECT TableName, TotalSpace, collection_time,
	(SELECT MAX(B.collection_time) FROM @source B WHERE B.TableName = A.TableName and B.collection_time<A.collection_time) AS prev_collection_time	
FROM @source A
)
SELECT D.TableName, D.TotalSpace, D.collection_time, D.prev_collection_time, D.TotalSpace-COALESCE(E.TotalSpace,0) AS delta
FROM cteXpression D
LEFT JOIN cteXpression E on D.TableName = E.TableName and D.prev_collection_time=E.collection_time

Результат выполнения:
TableName TotalSpace collection_time prev_collection_time delta
t1 1129032432 2017-09-19 01:00:02.000 2017-09-18 01:00:03.000 486776
t1 1128545656 2017-09-18 01:00:03.000 2017-09-17 01:00:02.000 620872
t1 1127924784 2017-09-17 01:00:02.000 2017-09-16 01:00:02.000 1272848
t1 1126651936 2017-09-15 11:54:01.000 NULL 1126651936
t1 1126651936 2017-09-16 01:00:02.000 2017-09-15 11:54:01.000 0
t2 1063103176 2017-09-19 01:00:02.000 2017-09-18 01:00:03.000 33632
t2 1063069544 2017-09-18 01:00:03.000 2017-09-17 01:00:02.000 11504
t2 1063058040 2017-09-17 01:00:02.000 2017-09-16 01:00:02.000 23896
t2 1063034144 2017-09-16 01:00:02.000 2017-09-15 11:54:01.000 25952
t2 1063008192 2017-09-15 11:54:01.000 NULL 1063008192
19 сен 17, 15:28    [20806403]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание значений строк  [new]
beaver06
Member

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

спасибо большое
19 сен 17, 15:47    [20806459]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание значений строк  [new]
beaver06
Member

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

По этому способу -затроение строк.
Пока не разобрался почему.

Но тоже спасибо.
19 сен 17, 17:26    [20806843]     Ответить | Цитировать Сообщить модератору
 Re: Вычитание значений строк  [new]
demind74
Member

Откуда:
Сообщений: 4
beaver06,
у TaPaK вариант гораздо интереснее, я то застрял еще в 2008 году.
21 сен 17, 15:06    [20812580]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить