Mặc dù bản thân bạn đã giải quyết được câu hỏi của mình, nhưng đây là một câu trả lời không sử dụng các hàm cửa sổ, đó là lag()
hoặc lead()
. Để so sánh sự khác biệt giữa up_date
dấu thời gian của nhật ký sự cố liên tiếp mà bạn có thể tự rời khỏi tham gia. Trong SQL, truy vấn có thể trông giống như
select ilx.id
from issue_logs ilx
join rt_status rsx on rsx.id = ilx.to_status
left join issue_logs ily on ily.from_status = ilx.to_status
and ily.issue_id = ilx.issue_id
where ilx.up_date >= '2018-09-06T16:34'
and ilx.up_date <= ( coalesce(ily.up_date, '2018-09-14T12:27') -
interval '1 minute' * rsx.duration_in_min );
và tương tự trong SQLAlchemy Ngôn ngữ biểu thức SQL :
from_datetime = '2018-09-06T16:34'
to_datetime = '2018-09-14T12:27'
ilx = issue_status_logs.alias()
ily = issue_status_logs.alias()
rsx = rt_status
query = select([ilx.c.id]).\
select_from(
ilx.
join(rsx, rsx.c.id == ilx.c.to_status).
outerjoin(ily, and_(ily.c.from_status == ilx.c.to_status,
ily.c.issue_id == ilx.c.issue_id))).\
where(and_(ilx.c.up_date >= from_datetime,
ilx.c.up_date <= (func.coalesce(ily.c.up_date, to_datetime) -
cast('1 minute', Interval) *
rsx.c.duration_in_min)))