SELECT t1.RecordID,t1.RISEID,t2.UpdateCounter
FROM
tbl_Partner t1
inner join
tbl_Partner t2
on
t1.RISEID = t2.RISEID
left join
tbl_Partner t1_anti
on
t1.RISEID = t1_anti.RISEID and
t1_anti.UpdateCounter < t1.UpdateCounter
left join
tbl_Partner t2_anti
on
t1.RISEID = t2_anti.RISEID and
t2_anti.UpdateCounter > t2.UpdateCounter
where
t1_anti.RISEID is null and
t2_anti.RISEID is null
Непонятно, хотите ли вы, чтобы строки отображались для элементов, в которых конкретная RISEID
имеет только одна строка. Если нет, добавьте дополнительное условие в объединение между t1
и t2
, чтобы UpdateCounter
было выше на t2
.
Два внешних соединения должны обеспечивать, чтобы не было более ранней строки, чем t1
(t1_anti
), и не более поздней строки, чем t2
(t2_anti
). В предложении WHERE
мы гарантируем, что эти объединения были неудачными.
Альтернативный, используя немного более современный стиль:
;With OrderedRows as (
Select RecordID,RISEID,UpdateCounter,
ROW_NUMBER() OVER (PARTITION BY RISEID ORDER BY UpdateCounter ASC) as rnEarly,
ROW_NUMBER() OVER (PARTITION BY RISEID ORDER BY UpdateCounter DESC) as rnLate
from tbl_Partner
)
SELECT t1.RecordID,t1.RISEID,t2.UpdateCounter
FROM
OrderedRows t1
inner join
OrderedRows t2
on
t1.RISEID = t2.RISEID
WHERE
t1.rnEarly = 1 and
t2.rnLate = 1
, что может потребовать меньше проверок на столе.