PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจจเฉˆเจตเฉ€เจ—เฉ‡เจŸ เจ•เจฐเจจเจพ

เจ…เฉฑเจœ SQL เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจ•เฉ‡เจธ เจ…เจคเฉ‡ เจธเฉ‚เจเจตเจพเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจ—เฉ‡เฅค เจ•เฉˆเจชเจŸเจจ เจธเจชเฉฑเจธเจผเจŸ เจฆเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡, เจธเจญ เจ•เฉเจ เจฌเจนเฉเจค เจธเจฐเจฒ เจนเฉ‹เจตเฉ‡เจ—เจพ - เจ†เจ“ เจ‡เจธ เจจเฉ‚เฉฐ เจ•เจฐเฉ€เจ เจ‡เจตเฉˆเจ‚เจŸ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจฆเฉ‡เจ– เจฐเจฟเจนเจพ เจนเฉˆ เจธเจฎเฉ‡เจ‚ เจ…เจจเฉเจธเจพเจฐ เจ•เฉเจฐเจฎเจฌเฉฑเจง.

เจฏเจพเจจเฉ€ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจšเจฟเฉฐเจจเฉเจน เจนเฉˆ events, เจ…เจคเฉ‡ เจ‰เจธ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจ–เฉ‡เจค เจนเฉˆ ts - เจฌเจฟเจฒเจ•เฉเจฒ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจ‡เจนเจจเจพเจ‚ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจคเจฐเจคเฉ€เจฌเจตเจพเจฐ เจขเฉฐเจ— เจจเจพเจฒ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚:

CREATE TABLE events(
  id
    serial
      PRIMARY KEY
, ts
    timestamp
, data
    json
);

CREATE INDEX ON events(ts DESC);

เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‰เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจฆเจฐเจœเจจ เจฐเจฟเจ•เจพเจฐเจก เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจ—เฉ‡, เจ‡เจธ เจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจ•เฉเจ เจฐเฉ‚เจช เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€ เจชเฉฐเจจเจพ เจจเฉˆเจตเฉ€เจ—เฉ‡เจธเจผเจจ.

#0เฅค "เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ€ เจฎเจพเจ‚ เจฆเจพ เจชเฉ‹เจ—เฉเจฐเฉ‹เจฎเจฟเจธเจŸ เจนเจพเจ‚"

cur.execute("SELECT * FROM events;")
rows = cur.fetchall();
rows.sort(key=lambda row: row.ts, reverse=True);
limit = 26
print(rows[offset:offset+limit]);

เจ‡เจน เจฒเจ—เจญเจ— เจ•เฉ‹เจˆ เจฎเจœเจผเจพเจ• เจจเจนเฉ€เจ‚ เจนเฉˆ - เจ‡เจน เจฆเฉเจฐเจฒเฉฑเจญ เจนเฉˆ, เจชเจฐ เจœเฉฐเจ—เจฒเฉ€ เจตเจฟเฉฑเจš เจชเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ. เจ•เจˆ เจตเจพเจฐ, ORM เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, SQL เจจเจพเจฒ "เจธเจฟเฉฑเจงเจพ" เจ•เฉฐเจฎ 'เจคเฉ‡ เจฌเจฆเจฒเจฃเจพ เจฎเฉเจธเจผเจ•เจฒ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจชเจฐ เจ†เจ“ เจนเฉ‹เจฐ เจ†เจฎ เจ…เจคเฉ‡ เจ˜เฉฑเจŸ เจธเจชเฉฑเจธเจผเจŸ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจตเฉฑเจฒ เจตเจงเฉ€เจเฅค

#1เฅค เจ†เจซเจธเฉˆเฉฑเจŸ

SELECT
  ...
FROM
  events
ORDER BY
  ts DESC
LIMIT 26 OFFSET $1; -- 26 - ะทะฐะฟะธัะตะน ะฝะฐ ัั‚ั€ะฐะฝะธั†ะต, $1 - ะฝะฐั‡ะฐะปะพ ัั‚ั€ะฐะฝะธั†ั‹

26 เจจเฉฐเจฌเจฐ เจ•เจฟเฉฑเจฅเฉ‹เจ‚ เจ†เจ‡เจ†? เจ‡เจน เจ‡เฉฑเจ• เจธเจ•เฉเจฐเฉ€เจจ เจจเฉ‚เฉฐ เจญเจฐเจจ เจฒเจˆ เจเจ‚เจŸเจฐเฉ€เจ†เจ‚ เจฆเฉ€ เจ…เฉฐเจฆเจพเจœเจผเจจ เจธเฉฐเจ–เจฟเจ† เจนเฉˆเฅค เจตเจงเฉ‡เจฐเฉ‡ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡, 25 เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจฐเจฟเจ•เจพเจฐเจก, เจชเจฒเฉฑเจธ 1, เจ‡เจน เจธเฉฐเจ•เฉ‡เจค เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ เจ•เจฟ เจจเจฎเฉ‚เจจเฉ‡ เจตเจฟเฉฑเจš เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ เจ•เฉเจ เจนเฉ‹เจฐ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจน เจ…เฉฑเจ—เฉ‡ เจตเจงเจฃ เจฆเจพ เจ…เจฐเจฅ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆเฅค

เจฌเฉ‡เจธเจผเฉฑเจ•, เจ‡เจน เจฎเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ‡ เจฎเฉเฉฑเจ– เจญเจพเจ— เจตเจฟเฉฑเจš "เจธเฉ€เจตเจฟเจ†" เจจเจนเฉ€เจ‚ เจœเจพ เจธเจ•เจฆเจพ, เจชเจฐ เจ‡เฉฑเจ• เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฆเฉเจ†เจฐเจพ เจชเจพเจธ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจชเจฐ เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, PostgreSQL เจธเจผเจกเจฟเจŠเจฒเจฐ เจ‡เจธ เจ—เจฟเจ†เจจ 'เจคเฉ‡ เจญเจฐเฉ‹เจธเจพ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟ เจฎเฉเจ•เจพเจฌเจฒเจคเจจ เจ˜เฉฑเจŸ เจฐเจฟเจ•เจพเจฐเจก เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ - เจ…เจคเฉ‡ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจ‡เฉฑเจ• เจฌเฉ‡เจ…เจธเจฐ เจฏเฉ‹เจœเจจเจพ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเฉ‡เจ—เจพ.

เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจตเจฟเฉฑเจš, เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฃเจพ เจตเจฟเจœเจผเฉ‚เจ…เจฒ "เจชเฉฐเจจเจฟเจ†เจ‚" เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจฌเจฆเจฒเจฃ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ•เฉ‹เจˆ เจตเฉ€ เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจฒเจˆ เจ•เฉ‹เจˆ เจตเฉ€ เจธเจผเฉฑเจ•เฉ€ เจšเฉ€เจœเจผ เจจเจนเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเจพ เจนเฉˆเฅค เจฌเจฟเจฒเจ•เฉเจฒ เจ‰เจธ เจชเจฒ เจคเฉฑเจ• เจœเจฆเฉ‹เจ‚, เจธเฉเจตเจฟเจงเจพ เจฒเจˆ เจธเฉฐเจ˜เจฐเจธเจผ เจตเจฟเฉฑเจš, UI/UX เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉ‚เฉฐ "เจ…เฉฐเจค เจฐเจนเจฟเจค เจธเจ•เฉเจฐเฉŒเจฒ" เจตเจฟเฉฑเจš เจฐเฉ€เจฎเฉ‡เจ• เจ•เจฐเจจ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เจฐเจฆเจพ เจนเฉˆ - เจญเจพเจต, เจธเจพเจฐเฉ€เจ†เจ‚ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจเจ‚เจŸเจฐเฉ€เจ†เจ‚ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจ–เจฟเฉฑเจšเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเจฟเจธเจจเฉ‚เฉฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ‰เฉฑเจชเจฐ เจ…เจคเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจธเจ•เฉเจฐเฉŒเจฒ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ…เจคเฉ‡ เจ‡เจธ เจฒเจˆ, เจ…เจ—เจฒเฉ€ เจœเจพเจ‚เจš เจฆเฉŒเจฐเจพเจจ, เจคเฉเจธเฉ€เจ‚ เจซเฉœเฉ‡ เจ—เจ เจนเฉ‹ เจฐเจฟเจ•เจพเจฐเจก เจฆเฉ€ เจจเจ•เจฒ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจตเจฟเฉฑเจš. เจ•เจฟเจ‰เจ‚, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ†เจฎ เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจนเฉˆ (ts), เจคเฉเจนเจพเจกเฉ€ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจ•เจฟเจธ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเฉ€ เจนเฉˆ?

เจฌเจฟเจฒเจ•เฉเจฒ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฟเจ† ts เจ‡เฉฑเจ• เจตเจฟเจฒเฉฑเจ–เจฃ เจ•เฉเฉฐเจœเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ‡เจธ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš. เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฎเฉเฉฑเจฒ เจตเจฟเจฒเฉฑเจ–เจฃ เจจเจนเฉ€เจ‚ เจนเจจ, เจ…เจธเจฒ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ•เจฟเจธเฉ‡ เจตเฉ€ "เจธเจฎเฉ‡เจ‚" เจฆเฉ€ เจคเจฐเฉเจนเจพเจ‚ - เจ‡เจธเจฒเจˆ, เจ‡เฉฑเจ•เฉ‹ เจ•เฉเฉฐเจœเฉ€ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจ›เจพเจ‚เจŸเจฃ เจฆเฉ‡ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจ…เฉฐเจคเจฎ เจ•เฉเจฐเจฎ เจฆเฉ‡ เจ•เจพเจฐเจจ เจฆเฉ‹ เจจเจพเจฒ เจฒเฉฑเจ—เจฆเฉ€เจ†เจ‚ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ›เจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ•เฉ‹ เจฐเจฟเจ•เจพเจฐเจก เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจ‡เฉฑเจ• เจชเฉฐเจจเฉ‡ เจคเฉ‹เจ‚ เจฆเฉ‚เจœเฉ‡ เจชเฉฐเจจเฉ‡ 'เจคเฉ‡ "เจœเฉฐเจช" เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจฆเจฐเจ…เจธเจฒ, เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจตเฉ€ เจ›เฉเจชเฉ€ เจนเฉ‹เจˆ เจนเฉˆ, เจœเจฟเจธ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฃเจพ เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจนเฉˆ - เจ•เฉเจ เจเจ‚เจŸเจฐเฉ€เจ†เจ‚ เจจเจนเฉ€เจ‚ เจฆเจฟเจ–เจพเจˆเจ†เจ‚ เจœเจพเจฃเจ—เฉ€เจ†เจ‚ เจคเฉ‡ เจธเจพเจฐเฉ‡! เจ†เจ–เจผเจฐเจ•เจพเจฐ, "เจกเฉเจชเจฒเฉ€เจ•เฉ‡เจŸ" เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจจเฉ‡ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจฆเฉ€ เจœเจ—เฉเจนเจพ เจฒเฉˆ เจฒเจˆ. เจธเฉเฉฐเจฆเจฐ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจตเจฟเจธเจคเฉเจฐเจฟเจค เจตเจฟเจ†เจ–เจฟเจ† เจฒเฉฑเจญเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ เจ‡เฉฑเจฅเฉ‡ เจชเฉœเฉเจนเฉ‹.

เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจฆเจพ เจตเจฟเจธเจคเจพเจฐ เจ•เจฐเจจเจพ

เจ‡เฉฑเจ• เจšเจฒเจพเจ• เจกเจฟเจตเฉˆเจฒเจชเจฐ เจธเจฎเจเจฆเจพ เจนเฉˆ เจ•เจฟ เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจ•เฉเฉฐเจœเฉ€ เจจเฉ‚เฉฐ เจตเจฟเจฒเฉฑเจ–เจฃ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจ†เจธเจพเจจ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจฟเจฒเฉฑเจ–เจฃ เจ–เฉ‡เจคเจฐ เจจเจพเจฒ เจตเจฟเจธเจคเจพเจฐ เจ•เจฐเจจเจพ, เจœเจฟเจธ เจฒเจˆ PK เจธเฉฐเจชเฉ‚เจฐเจจ เจนเฉˆ:

CREATE UNIQUE INDEX ON events(ts DESC, id DESC);

เจ…เจคเฉ‡ เจฌเฉ‡เจจเจคเฉ€ เจฌเจฆเจฒเจฆเฉ€ เจนเฉˆ:

SELECT
  ...
ORDER BY
  ts DESC, id DESC
LIMIT 26 OFFSET $1;

#2. "เจ•เจฐเจธเจฐ" เจคเฉ‡ เจธเจตเจฟเจš เจ•เจฐเฉ‹

เจ•เฉเจ เจธเจฎเฉ‡เจ‚ เจฌเจพเจ…เจฆ, เจ‡เฉฑเจ• DBA เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจคเฉ‹เจ‚ "เจ–เฉเจธเจผ" เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ‰เจน เจ†เจชเจฃเฉ‡ เจ†เจซเจธเฉˆเฉฑเจŸ เจจเจฟเจฏเจฎเจพเจ‚ เจจเจพเจฒ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจจเจฐเจ• เจตเจพเจ‚เจ— เจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เจธ 'เจคเฉ‡ เจธเจตเจฟเจš เจ•เจฐเจจ เจฆเจพ เจธเจฎเจพเจ‚ เจ† เจ—เจฟเจ† เจนเฉˆ เจฆเจฟเจ–เจพเจ เจ—เจ เจ†เจ–เจฐเฉ€ เจฎเฉเฉฑเจฒ เจคเฉ‹เจ‚ เจจเฉˆเจตเฉ€เจ—เฉ‡เจธเจผเจจ. เจคเฉเจนเจพเจกเฉ€ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจฆเฉเจฌเจพเจฐเจพ เจฌเจฆเจฒเจฆเฉ€ เจนเฉˆ:

SELECT
  ...
WHERE
  (ts, id) < ($1, $2) -- ะฟะพัะปะตะดะฝะธะต ะฟะพะปัƒั‡ะตะฝะฝั‹ะต ะฝะฐ ะฟั€ะตะดั‹ะดัƒั‰ะตะผ ัˆะฐะณะต ะทะฝะฐั‡ะตะฝะธั
ORDER BY
  ts DESC, id DESC
LIMIT 26;

เจคเฉเจธเฉ€เจ‚ เจธเฉเฉฑเจ– เจฆเจพ เจธเจพเจน เจฒเจฟเจ† เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ‡เจน เจจเจนเฉ€เจ‚ เจ†เจ‡เจ† ...

#3. เจธเจซเจผเจพเจˆ เจธเฉ‚เจšเจ•เจพเจ‚เจ•

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เฉฑเจ• เจฆเจฟเจจ เจคเฉเจนเจพเจกเจพ เจกเฉ€.เจฌเฉ€.เจ เจฌเฉ‡เจ…เจธเจฐ เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจฒเฉฑเจญเจฃ เจฌเจพเจฐเฉ‡ เจฒเฉ‡เจ– เจ…เจคเฉ‡ เจ‡เจน เจฎเจนเจฟเจธเฉ‚เจธ เจ•เฉ€เจคเจพ "เจจเจตเฉ€เจจเจคเจฎ เจจเจนเฉ€เจ‚" เจŸเจพเจˆเจฎเจธเจŸเฉˆเจ‚เจช เจตเจงเฉ€เจ† เจจเจนเฉ€เจ‚ เจนเฉˆ. เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฆเฉเจฌเจพเจฐเจพ เจ†เจ‡เจ† เจนเจพเจ‚ - เจนเฉเจฃ เจ‡เจน เจธเฉ‹เจš เจ•เฉ‡ เจ•เจฟ เจ‰เจน เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจ…เจœเฉ‡ เจตเฉ€ เจตเจพเจชเจธ เจ†เจ‰เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ (ts DESC).

เจชเจฐ เจชเฉฐเจจเจฟเจ†เจ‚ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ "เจœเฉฐเจชเจฟเฉฐเจ—" เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจ•เฉ€ เจ•เจฐเจจเจพ เจนเฉˆ?.. เจ…เจคเฉ‡ เจธเจญ เจ•เฉเจ เจธเจงเจพเจฐเจจ เจนเฉˆ - เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจจเจฟเจธเจผเจšเจฟเจค เจ—เจฟเจฃเจคเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจฌเจฒเจพเจ•เจพเจ‚ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ!

เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ•เฉŒเจฃ เจธเจพเจจเฉ‚เฉฐ "เจฌเจฟเจฒเจ•เฉเจฒ 26" เจจเจนเฉ€เจ‚, เจชเจฐ "26 เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจจเจนเฉ€เจ‚" เจชเฉœเฉเจนเจจ เจคเฉ‹เจ‚ เจฎเจจเฉเจนเจพ เจ•เจฐเจฆเจพ เจนเฉˆ? เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เจธ เจฒเจˆ เจ…เจ—เจฒเฉ‡ เจฌเจฒเจพเจ• เจตเจฟเฉฑเจš เจนเจจ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเฉฑเจ–เจฐเฉ‡ เจ…เจฐเจฅเจพเจ‚ เจตเจพเจฒเฉ‡ เจฐเจฟเจ•เจพเจฐเจก ts - เจซเจฟเจฐ เจฌเจฒเจพเจ•เจพเจ‚ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ "เจœเฉฐเจชเจฟเฉฐเจ—" เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เฉ€!

เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจนเฉˆ เจ‡เจน เจ‡เฉฑเจฅเฉ‡ เจนเฉˆ:

SELECT
  ...
WHERE
  ts < $1 AND
  ts >= coalesce((
    SELECT
      ts
    FROM
      events
    WHERE
      ts < $1
    ORDER BY
      ts DESC
    LIMIT 1 OFFSET 25
  ), '-infinity')
ORDER BY
  ts DESC;

เจ‡เฉฑเจฅเฉ‡ เจ•เฉ€ เจนเฉ‹ เจฐเจฟเจนเจพ เจนเฉˆ?

  1. เจ…เจธเฉ€เจ‚ 25 เจฐเจฟเจ•เจพเจฐเจก "เจนเฉ‡เจ เจพเจ‚" เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ "เจธเฉ€เจฎเจพ" เจฎเฉเฉฑเจฒ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ ts.
  2. เจœเฉ‡เจ•เจฐ เจ‰เฉฑเจฅเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ NULL เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจจเจพเจฒ เจฌเจฆเจฒเฉ‹ -infinity.
  3. เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจพเจชเจค เจฎเฉเฉฑเจฒ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจฎเฉเฉฑเจฒเจพเจ‚ เจฆเฉ‡ เจชเฉ‚เจฐเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ ts เจ…เจคเฉ‡ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจคเฉ‹เจ‚ เจชเจพเจธ เจ•เฉ€เจคเจพ เจ—เจฟเจ† $1 เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ (เจชเจฟเจ›เจฒเจพ "เจ†เจ–เจฐเฉ€" เจฐเฉˆเจ‚เจกเจฐ เจ•เฉ€เจคเจพ เจฎเฉเฉฑเจฒ)เฅค
  4. เจœเฉ‡เจ•เจฐ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• 26 เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจจเจพเจฒ เจตเจพเจชเจธ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจน เจ†เจ–เจฐเฉ€ เจนเฉˆเฅค

เจœเจพเจ‚ เจ‰เจนเฉ€ เจคเจธเจตเฉ€เจฐ:
PostgreSQL เจเจ‚เจŸเฉ€เจชเฉˆเจŸเจฐเจจ: เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจจเฉˆเจตเฉ€เจ—เฉ‡เจŸ เจ•เจฐเจจเจพ

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจนเฉเจฃ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจนเฉˆ เจจเจฎเฉ‚เจจเฉ‡ เจฆเฉ€ เจ•เฉ‹เจˆ เจ–เจพเจธ "เจธเจผเฉเจฐเฉ‚เจ†เจค" เจจเจนเฉ€เจ‚ เจนเฉˆ, เจซเจฟเจฐ เจ•เฉ‹เจˆ เจตเฉ€ เจšเฉ€เจœเจผ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจ‰เจฒเจŸ เจฆเจฟเจธเจผเจพ เจตเจฟเฉฑเจš "เจตเจฟเจธเจคเจพเจฐ" เจ•เจฐเจจ เจ…เจคเฉ‡ "เจธเฉฐเจฆเจฐเจญ เจฌเจฟเฉฐเจฆเฉ‚" เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจฌเจฒเจพเจ•เจพเจ‚ เจฆเฉ€ เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจฒเฉ‹เจกเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจฆเฉ‹เจตเฉ‡เจ‚ เจฆเจฟเจธเจผเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฐเฉ‹เจ•เจฆเฉ€ เจนเฉˆ - เจฆเฉ‹เจตเฉ‡เจ‚ เจนเฉ‡เจ เจพเจ‚ เจ…เจคเฉ‡ เจ‰เฉฑเจชเจฐเฅค

เจจเฉ‹เจŸ

  1. เจนเจพเจ‚, เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฆเฉ‹ เจตเจพเจฐ เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจจเฉ‚เฉฐ เจเจ•เจธเฉˆเจธ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจธเจญ เจ•เฉเจ "เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจฆเฉเจ†เจฐเจพ" เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ, เจ‡เฉฑเจ• เจธเจฌเจ•เจตเฉ‡เจฐเฉ€ เจฆเจพ เจจเจคเฉ€เจœเจพ เจนเฉ€ เจจเจฟเจ•เจฒเฉ‡เจ—เจพ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจตเจพเจงเฉ‚ เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจธเจ•เฉˆเจจ เจฒเจˆ.
  2. เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ เจ•เจฟ เจ‡เจน เจคเจ•เจจเฉ€เจ• เจธเจฟเจฐเจซ เจ‰เจฆเฉ‹เจ‚ เจตเจฐเจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจฎเฉเฉฑเจฒ เจนเจจ ts เจธเจฟเจฐเจซ เจฎเฉŒเจ•เจพ เจฆเฉ‡ เจ•เฉ‡ เจชเจพเจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจจเจนเฉ€เจ‚ เจนเจจ. เจœเฉ‡ เจคเฉเจนเจพเจกเจพ เจ†เจฎ เจ•เฉ‡เจธ "00:00:00.000 'เจคเฉ‡ เจ‡เฉฑเจ• เจฎเจฟเจฒเฉ€เจ…เจจ เจฐเจฟเจ•เจพเจฐเจก" เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจœเจฟเจนเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพเฅค เจฎเฉ‡เจฐเจพ เจฎเจคเจฒเจฌ เจนเฉˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจœเจฟเจนเจพ เจฎเจพเจฎเจฒเจพ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃ เจฆเฉ‡เจฃเจพ เจšเจพเจนเฉ€เจฆเจพเฅค เจชเจฐ เจœเฉ‡ เจ…เจœเจฟเจนเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจฆเฉ‡ เจจเจพเจฒ เจตเจฟเจ•เจฒเจช เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹