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. āĻšā§āĻ¯āĻžāĻ, āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸ā§‚āĻšāĻ•āĻŸāĻŋ āĻĻā§āĻŦāĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•āĻ°āĻŋ, āĻ¤āĻŦā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§āĻ‡ "āĻļā§āĻĻā§āĻ§āĻ­āĻžāĻŦā§‡ āĻ¸ā§‚āĻšāĻ• āĻĻā§āĻŦāĻžāĻ°āĻž"āĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻāĻ•āĻŸāĻŋ subquery āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻšāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ¸ā§‚āĻšāĻ• āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨.
  2. āĻāĻŸāĻŋ āĻŦā§‡āĻļ āĻ¸ā§āĻĒāĻˇā§āĻŸ āĻ¯ā§‡ āĻāĻ‡ āĻ•ā§ŒāĻļāĻ˛āĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¤āĻ–āĻ¨āĻ‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯āĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŽāĻžāĻ¨ āĻĨāĻžāĻ•ā§‡ ts āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸ā§āĻ¯ā§‹āĻ— āĻĻā§āĻŦāĻžāĻ°āĻž āĻ…āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ•āĻŋāĻ›ā§. āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ•ā§‡āĻ¸ "00:00:00.000 āĻ āĻāĻ• āĻŽāĻŋāĻ˛āĻŋāĻ¯āĻŧāĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ" āĻšāĻ¯āĻŧ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻŸāĻŋ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤ āĻ†āĻŽāĻŋ āĻŦāĻ˛āĻ¤ā§‡ āĻšāĻžāĻšā§āĻ›āĻŋ, āĻ†āĻĒāĻ¨āĻžāĻ° āĻāĻŽāĻ¨ āĻ˜āĻŸāĻ¨āĻž āĻ˜āĻŸāĻ¤ā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻ˜āĻŸā§‡ āĻ¤āĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻ°ā§āĻ§āĻŋāĻ¤ āĻ¸ā§‚āĻšāĻ• āĻ¸āĻš āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨āĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨