Это разновидность общего запроса «наибольшее N на группу», который появляется каждую неделю в StackOverflow.
SELECT m1.id, m1.mydate AS date_actual, m1.myvalue AS value_actual,
m2.mydate AS date_previous, m2.myvalue AS value_previous
FROM mytable m1
LEFT OUTER JOIN mytable m2
ON (m1.id = m2.id AND m1.mydate > m2.mydate)
LEFT OUTER JOIN mytable m3
ON (m1.id = m3.id AND m1.mydate > m3.mydate AND m3.mydate > m2.mydate)
WHERE m3.id IS NULL;
Другими словами, m2
- это все строки с одинаковым id
и меньшим mydate
, но нам нужен только один такой, чтобы не было строки m3
с датой между m1
и m2
. Если предположить, что даты уникальны, в m2
будет только одна строка, где это правда.