Расчет разницы для элемента, между самыми последними датами - PullRequest
0 голосов
/ 16 апреля 2019

Я рассчитываю рассчитывать разницу между весами моих загруженных грузовиков каждый день. По сути, я хочу знать, какие суммы добавляются каждый день. Теоретически, грузовики будут работать ежедневно, но я использую упрощенный набор данных в своей фиктивной базе данных.

Вот код, который я придумал:

--create table dbo.truck 
--(TruckID int, Weight float, datetrunc date, weightdiff float)
declare @dt1 datetime, @dt2 datetime
select @dt2 = max(datetrunc) from truck
select @dt1 = max(datetrunc) from truck where datetrunc < @dt2
select @dt1 [dt1], @dt2 [dt2]

SELECT t1.truckid, t2.weight - t1.weight [WeightDiff]
FROM truck t1
inner join truck t2 ON t1.truckid = t2.truckid
WHERE t1.datetrunc = @dt1
AND   t2.datetrunc = @dt2


UPDATE truck SET WeightDiff = x.WeightDiff
FROM (
SELECT t1.truckid, t2.weight - t1.weight [WeightDiff]
FROM truck t1
inner join truck t2 ON t1.truckid = t2.truckid
WHERE t1.datetrunc = @dt1
AND   t2.datetrunc = @dt2
) AS X
WHERE truck.datetrunc = @dt2
AND x.truckid = truck.truckid


SELECT t1.truckid,  @dt2,      t2.weight - t1.weight 
FROM truck t1
inner join truck t2 ON t1.truckid = t2.truckid
WHERE t1.datetrunc = @dt1
AND   t2.datetrunc = @dt2

Я надеюсь на разницу между показанными датами. Тем не менее, разница между последними датами отображается только при удалении, а остальные строки удаляются и обнуляются:

TruckID Weight  datetrunc   weightdiff
1   1000    2019-03-01  NULL
2   1111    2019-03-01  NULL
3   1222    2019-03-01  NULL
1   1050    2019-03-15  NULL
2   1700    2019-03-15  NULL
3   1400    2019-03-15  NULL
1   1125    2019-03-31  75
2   1725    2019-03-31  25
3   1600    2019-03-31  200

Я хочу:

TruckID Weight  datetrunc   weightdiff
1   1000    2019-03-01  NULL
2   1111    2019-03-01  NULL
3   1222    2019-03-01  NULL
4   1400    2019-03-01  NULL
1   1050    2019-03-15  50
2   1700    2019-03-15  589
3   1400    2019-03-15  178
4   1490    2019-03-15  90
1   1125    2019-03-31  75
2   1725    2019-03-31  25
3   1600    2019-03-31  200
4   1900    2019-03-31  510

Обратите внимание, что некоторые TruckID 4 были завершены, удалены из моего набора данных. Кроме того, как он заменяет разницу в весе.

Я не могу понять, как заставить мои данные отображаться правильно. Любые предложения помогите, спасибо!

1 Ответ

1 голос
/ 16 апреля 2019

для SQL Server 2008

select a.truckid, a.weight, a.datetrunc, (a.weight - c.weight) weightdiff
from truck a
outer apply (select top 1 weight from truck b where b.datetrunc<a.datetrunc and b.truckid=a.truckid order by b.datetrunc desc) c

Более новый SQL Server

select truckid, weight, datetrunc, weight - lag(weight) over (partition by truckid order by datetrunc) weightdiff
from truck
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...