Gaby94 Ответов: 3

Как вычесть первое значение таблицы из последнего значения в SQL


У меня есть этот стол :
TBL_ENERGII
ID    | DateTime                | [CM1-Ea]
16431 | 2020-09-22 06:00:00.000 | 2627123.9
16432 | 2020-09-22 14:00:00.000 | 2627900.0
16433 | 2020-09-22 22:00:00.000 | 2628547.0
16434 | 2020-09-23 06:00:00.000 | 2629204.0
16435 | 2020-09-23 14:00:00.000 | 2629899.9
16436 | 2020-09-23 22:00:00.000 | 2630600.5


Я хочу вычесть первое значение таблицы из последнего значения таблицы. Да это не все данные, которые есть в этой таблице. Значения находятся от @DataStart до @DataStop.

Что я уже пробовал:

Я пытался :

SELECT	
		(p2.[CM1-Ea]-p1.[CM1-Ea]) AS Diff
	FROM 
		[DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p1,
		[DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p2
	WHERE p1.DateTime IN (SELECT TOP 1 p.DateTime
							FROM [DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p
							WHERE p.DateTime BETWEEN @DataStart AND @DataStop )
		AND p2.DateTime = (SELECT TOP 1 p.DateTime
							FROM [DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p
							ORDER BY p.DateTime DESC)

3 Ответов

Рейтинг:
4

Gaby94

Я выясняю это сам, вместо того чтобы использовать p1.DateTime и p2.DateTime, которые я использовал p.ID и еще p2.ID и он действительно предоставляет данные, которые я хотел.

SELECT	
		(p2.[CM1-Ea]-p1.[CM1-Ea]) AS Diff
	FROM 
		[DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p1,
		[DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p2
	WHERE p1.ID IN (SELECT TOP 1 p.ID
							FROM [DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p
							WHERE p.DateTime BETWEEN @DataStart AND @DataStop )
		AND p2.ID = (SELECT TOP 1 p.ID
							FROM [DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII] p
							WHERE p.DateTime BETWEEN @DataStart AND @DataStop
							ORDER BY p.DateTime DESC)


Maciej Los

Пожалуйста, смотрите мой комментарий к ответу OriginalGriff.

Рейтинг:
23

OriginalGriff

Попробуй:

SELECT  b.[CM1-Ea] - a.[CM1-Ea] FROM 
   (SELECT TOP 1 [DateTime], [CM1-Ea] FROM TBL_ENERGII ORDER BY DateTime ASC) a,
   (SELECT TOP 1 [DateTime], [CM1-Ea] FROM TBL_ENERGII ORDER BY DateTime DESC) b


Maciej Los

Пол, зачем использовать подзапрос, если есть функция MIN и MAX? Взгляните на мой ответ.

OriginalGriff

Поскольку он хочет вычесть не максимальные или минимальные значения CM1-Ea, а значения CM1-Ea, связанные с максимальными и минимальными значениями DateTime, которые его интересуют.

Gaby94

Да @OriginalGriff прав, извините, если это было не так очевидно

Рейтинг:
2

Richard Deeming

Если вы используете SQL Server 2016 или более позднюю версию, вы можете использовать FIRST_VALUE[^] и ПОСЛЕДНЕЕ ЗНАЧЕНИЕ[^] должностные обязанности. В зависимости от ваших индексов, это может быть немного более эффективным.

SELECT TOP 1
    FIRST_VALUE([CM1-Ea]) OVER (ORDER BY [DateTime])
    - LAST_VALUE([CM1-Ea]) OVER (ORDER BY [DateTime] RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
    As Diff
FROM
    [DBScadaCloudPrutulLogger].[dbo].[TBL_ENERGII]
WHERE
    [DateTime] Between @DataStart And @DataStop
;
NB: То RANGE BETWEEN оговорка обязательна на LAST_VALUE вызовите, иначе функция не будет принимать во внимание ни одной строки после первой строки.


Maciej Los

5ed!