SQL сравнение строк по датам?

Имеется таблица log с логами следующего содержания:
id | link_id | date | value
где id порядковый номер, link_id связь с другой таблицей, date дата создания записи, value значение.

Требуется найти разность value у последней и предпоследней даты для каждого link_id, у самого получается что-то подобное:

select log1.link_id,log2.link_id,log1.value,log2.value,log1.value - log2.value as diff,log1.date,log2.date
from log as log1, log as log2
where log1.link_id = log2.link_id and 
log2.date = (select max(date) from log as log3 where log3.link_id = log2.link_id) and 
log1.date = (select max(date) from log as log4 where log4.link_id = log1.link_id and log4.date = (select max(date) from log as log5 where log5.link_id = log4.link_id))


По моему мнению логика такая: выводим разницу между value где совпадают link_id и где одна дата максимальная, другая перед максимальная
  • Вопрос задан
  • 5153 просмотра
Решения вопроса 1
@kirillzorin
А чем вас ваш собственный вариант не устраивает? Там нужно только исправить "=" на "<" в условии "log4.date =".
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SabMakc
@SabMakc
Для MS SQL можно использовать такой запрос:
select link_id, sum(case NUM when 1 then [date] when 2 then [date]*(-1) else 0 end)
from (select ROW_NUMBER() over (PARTITION BY link_id order by [date]) as NUM, link_id, [date] from [log])t
group by link_id
Ответ написан
@SabMakc, немного не верно. Нам нужна разница value, а не [date]. И что за [date]*(-1)???
Правильно будет так:
select link_id, sum(case NUM 
                      when 1 then value 
		      when 2 then value*(-1) 
		      else 0 
		    end)
from (select ROW_NUMBER() over (PARTITION BY link_id order by [date] desc) as NUM, link_id, value from log) t
group by link_id
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы