आप इसे आजमा सकते हैं - मैं यह गारंटी नहीं देने जा रहा हूं कि यह बेहतर प्रदर्शन करेगा, लेकिन यह एक "पिछली" पंक्ति के साथ एक पंक्ति को सहसंबंधित करने का मेरा सामान्य तरीका है:
SELECT
* --TODO, list columns
FROM
data d
left join
data d_prev
on
d_prev.time < d.time --TODO - Other key columns?
left join
data d_inter
on
d_inter.time < d.time and
d_prev.time < d_inter.time --TODO - Other key columns?
WHERE
d_inter.time is null AND
(d_prev.value is null OR d_prev.value <> d.value)
(मुझे लगता है कि यह सही है - इसे सत्यापित करने के लिए कुछ नमूना डेटा के साथ कर सकता है)।
मूल रूप से, विचार तालिका में स्वयं से जुड़ने का है, और प्रत्येक पंक्ति के लिए (d
. में) ), उम्मीदवार पंक्तियों को खोजें (d_prev
. में) ) "पिछली" पंक्ति के लिए। फिर एक पंक्ति खोजने का प्रयास करने के लिए एक और जुड़ाव करें (d_inter
. में) ) जो वर्तमान पंक्ति के बीच मौजूद है (d
. में) ) और उम्मीदवार पंक्ति (d_prev
. में) ) अगर हमें ऐसी कोई पंक्ति नहीं मिलती है (d_inter.time is null
), तो वह उम्मीदवार वास्तव में पिछली पंक्ति था।