Мне кажется, я понимаю, для чего ты идешь. Можете ли вы попробовать это и дайте мне знать, если он это делает?
SELECT
CASE
WHEN type='typ1' THEN id
WHEN type='typ2' THEN (
SELECT T1.id
FROM TheTable AS T1
WHERE T1.date=(SELECT MAX(T2.date)
FROM TheTable AS T2
WHERE T2.type='typ1' AND T2.date<TheTable.date)
AND T1.type='typ1')
END AS order_by_value,
id, body, date, type
FROM TheTable
ORDER BY order_by_value, type, date;
Это будет проблематично, если есть записи 'typ2' с датами, меньшими, чем наименьшая дата 'typ1'; в противном случае он должен работать нормально.
Если вы не хотите, чтобы столбец «order_by_value» в вашем наборе результатов, отмените выбор из предыдущего запроса SQL следующим образом:
SELECT id, body, date, type
FROM (
SELECT
CASE
WHEN type='typ1' THEN id
WHEN type='typ2' THEN (
SELECT T1.id
FROM TheTable AS T1
WHERE T1.date=(SELECT MAX(T2.date)
FROM TheTable AS T2
WHERE T2.type='typ1' AND T2.date<TheTable.date)
AND T1.type='typ1')
END AS order_by_value,
id, body, date, type
FROM TheTable
ORDER BY order_by_value, type, date);