SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ

แƒžแƒ”แƒ แƒ˜แƒแƒ“แƒฃแƒšแƒแƒ“ แƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒซแƒ”แƒ‘แƒœแƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒกแƒแƒœแƒแƒ› แƒแƒ  แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒกแƒแƒ”แƒ แƒ—แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก.

แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” "แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜" แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒ แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ 20 แƒฃแƒซแƒ•แƒ”แƒšแƒ”แƒกแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ, แƒฉแƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒšแƒ˜ แƒ—แƒแƒœแƒแƒ›แƒจแƒ แƒแƒ›แƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒแƒจแƒ˜ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ˜แƒ›แƒแƒ•แƒ” แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜). แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒ”แƒœแƒ”แƒฏแƒ”แƒ แƒฃแƒšแƒ˜ "แƒ“แƒแƒคแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก" แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒกแƒคแƒ”แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ™แƒšแƒ” แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ˜แƒ—, แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ—แƒ”แƒ›แƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ.

SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ

แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ•แƒ— PostgreSQL-แƒ–แƒ” แƒแƒ›แƒ’แƒ•แƒแƒ แƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒ˜แƒก โ€žแƒ’แƒฃแƒšแƒฃแƒ‘แƒ แƒงแƒ•แƒ˜แƒšแƒโ€œ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก, โ€žแƒญแƒ™แƒ•แƒ˜แƒแƒœแƒฃแƒ แƒ˜โ€œ แƒ“แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ แƒ—แƒฃแƒšแƒ˜ แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒก. "แƒ›แƒแƒ แƒงแƒฃแƒŸแƒ˜" SQL-แƒจแƒ˜ แƒแƒฆแƒ›แƒแƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒกแƒแƒกแƒ•แƒšแƒ”แƒšแƒ˜ แƒžแƒ˜แƒ แƒแƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒ“แƒ’แƒ”แƒ‘แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒกแƒฎแƒ•แƒ แƒ›แƒกแƒ’แƒแƒ•แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒจแƒ˜ แƒ’แƒแƒ›แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“.

แƒแƒ•แƒ˜แƒฆแƒแƒ— แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜ แƒฌแƒ˜แƒœแƒ แƒกแƒขแƒแƒขแƒ˜แƒ. แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒแƒ  "แƒฎแƒขแƒฃแƒœแƒ“แƒ”แƒก" แƒ“แƒ แƒแƒ“แƒแƒ“แƒ แƒ, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ“แƒแƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ, แƒ’แƒแƒแƒคแƒแƒ แƒ—แƒแƒ•แƒ”แƒ— แƒกแƒแƒ’แƒœแƒ˜แƒก แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“แƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—. แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒ”แƒก แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ›แƒ˜แƒกแƒชแƒ”แƒ›แƒก แƒ›แƒแƒก แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒแƒ‘แƒแƒก แƒ“แƒ แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒแƒก แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ แƒ˜แƒ’แƒ˜แƒก แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒแƒ‘แƒแƒก:

CREATE INDEX ON task(owner_id, task_date, id);
-- ะฐ ัั‚ะฐั€ั‹ะน - ัƒะดะฐะปะธะผ
DROP INDEX task_owner_id_task_date_idx;

แƒ แƒแƒ’แƒแƒ แƒช แƒ˜แƒกแƒ›แƒ˜แƒก, แƒ˜แƒกแƒ” แƒฌแƒ”แƒ แƒ˜แƒ

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ›แƒแƒ•แƒกแƒแƒฎแƒแƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ, แƒจแƒ”แƒ›แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒ›แƒแƒฌแƒ›แƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒ— แƒ›แƒแƒกแƒ˜แƒ•แƒ˜ แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ—:

SELECT
  *
FROM
  task
WHERE
  owner_id = ANY('{1,2,4,8,16,32,64,128,256,512}'::integer[])
ORDER BY
  task_date, id
LIMIT 20;

SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒชแƒแƒขแƒ แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ - แƒ›แƒฎแƒแƒšแƒแƒ“ 20 แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒจแƒ”แƒ•แƒฃแƒ™แƒ•แƒ”แƒ—แƒ”แƒ— แƒ“แƒ Index Scan-แƒ›แƒ แƒ“แƒแƒ’แƒ•แƒ˜แƒ‘แƒ แƒฃแƒœแƒ 960 แƒฎแƒแƒ–แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒœแƒ“แƒ แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒงแƒ... แƒ“แƒ แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒฌแƒแƒ•แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ—.

unnest + ARRAY

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒแƒกแƒแƒ–แƒ แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒ’แƒ•แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ - แƒ—แƒฃ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒกแƒฃแƒš 20 แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜, แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒแƒ แƒแƒฃแƒ›แƒ”แƒขแƒ”แƒก 20 แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ”แƒ แƒ—แƒ˜แƒ“แƒแƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜. แƒ™แƒแƒ แƒ’แƒ˜, แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ (owner_id, task_date, id) แƒ’แƒ•แƒแƒฅแƒ•แƒก.

แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ โ€žแƒกแƒ•แƒ”แƒขแƒ”แƒ‘แƒแƒ“ แƒ’แƒแƒ“แƒแƒฅแƒชแƒ”แƒ•แƒ˜แƒกโ€œ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜. แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒšแƒฃแƒ แƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒ‘แƒแƒšแƒ แƒกแƒขแƒแƒขแƒ˜แƒ. แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ™แƒแƒœแƒ•แƒแƒšแƒฃแƒชแƒ˜แƒ แƒ›แƒแƒกแƒ˜แƒ•แƒ–แƒ” แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— ARRAY():

WITH T AS (
  SELECT
    unnest(ARRAY(
      SELECT
        t
      FROM
        task t
      WHERE
        owner_id = unnest
      ORDER BY
        task_date, id
      LIMIT 20 -- ะพะณั€ะฐะฝะธั‡ะธะฒะฐะตะผ ั‚ัƒั‚...
    )) r
  FROM
    unnest('{1,2,4,8,16,32,64,128,256,512}'::integer[])
)
SELECT
  (r).*
FROM
  T
ORDER BY
  (r).task_date, (r).id
LIMIT 20; -- ... ะธ ั‚ัƒั‚ - ั‚ะพะถะต

SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒแƒฐ, แƒ”แƒก แƒฃแƒ™แƒ•แƒ” แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜แƒ! 40%-แƒ˜แƒ— แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒ˜ แƒ“แƒ 4.5-แƒฏแƒ”แƒ  แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒฃแƒœแƒ“แƒ แƒฌแƒแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ.

แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒขแƒ”แƒ แƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ CTE-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—แƒแƒ›แƒแƒก แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒแƒ• แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ— แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒšแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒแƒฃแƒงแƒแƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ แƒฅแƒ•แƒ”แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜ แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, CTE-แƒจแƒ˜ โ€žแƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒ˜แƒกโ€œ แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒแƒก "แƒ’แƒแƒ›แƒ แƒแƒ•แƒšแƒ”แƒ‘แƒ" InitPlan แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒžแƒ แƒแƒžแƒแƒ แƒชแƒ˜แƒฃแƒšแƒ˜แƒ:

SELECT
  ((
    SELECT
      t
    FROM
      task t
    WHERE
      owner_id = 1
    ORDER BY
      task_date, id
    LIMIT 1
  ).*);

Result  (cost=4.77..4.78 rows=1 width=16) (actual time=0.063..0.063 rows=1 loops=1)
  Buffers: shared hit=16
  InitPlan 1 (returns $0)
    ->  Limit  (cost=0.42..1.19 rows=1 width=48) (actual time=0.031..0.032 rows=1 loops=1)
          Buffers: shared hit=4
          ->  Index Scan using task_owner_id_task_date_id_idx on task t  (cost=0.42..387.57 rows=500 width=48) (actual time=0.030..0.030 rows=1 loops=1)
                Index Cond: (owner_id = 1)
                Buffers: shared hit=4
  InitPlan 2 (returns $1)
    ->  Limit  (cost=0.42..1.19 rows=1 width=48) (actual time=0.008..0.009 rows=1 loops=1)
          Buffers: shared hit=4
          ->  Index Scan using task_owner_id_task_date_id_idx on task t_1  (cost=0.42..387.57 rows=500 width=48) (actual time=0.008..0.008 rows=1 loops=1)
                Index Cond: (owner_id = 1)
                Buffers: shared hit=4
  InitPlan 3 (returns $2)
    ->  Limit  (cost=0.42..1.19 rows=1 width=48) (actual time=0.008..0.008 rows=1 loops=1)
          Buffers: shared hit=4
          ->  Index Scan using task_owner_id_task_date_id_idx on task t_2  (cost=0.42..387.57 rows=500 width=48) (actual time=0.008..0.008 rows=1 loops=1)
                Index Cond: (owner_id = 1)
                Buffers: shared hit=4"
  InitPlan 4 (returns $3)
    ->  Limit  (cost=0.42..1.19 rows=1 width=48) (actual time=0.009..0.009 rows=1 loops=1)
          Buffers: shared hit=4
          ->  Index Scan using task_owner_id_task_date_id_idx on task t_3  (cost=0.42..387.57 rows=500 width=48) (actual time=0.009..0.009 rows=1 loops=1)
                Index Cond: (owner_id = 1)
                Buffers: shared hit=4

แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ "แƒ›แƒแƒซแƒ”แƒ‘แƒœแƒ”แƒก" 4-แƒฏแƒ”แƒ ... PostgreSQL 11-แƒ›แƒ“แƒ” แƒ”แƒก แƒฅแƒชแƒ”แƒ•แƒ แƒ แƒ”แƒ’แƒฃแƒšแƒแƒ แƒฃแƒšแƒแƒ“ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ แƒแƒ แƒ˜แƒก "แƒ’แƒแƒ“แƒแƒฎแƒ•แƒ”แƒ•แƒ" CTE-แƒจแƒ˜, แƒ แƒแƒช แƒแƒ› แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒจแƒ˜ แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒขแƒแƒ แƒ˜แƒก แƒฃแƒžแƒ˜แƒ แƒแƒ‘แƒ แƒกแƒแƒ–แƒฆแƒ•แƒแƒ แƒ˜แƒ.

แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ แƒแƒ™แƒฃแƒ›แƒฃแƒšแƒแƒขแƒแƒ แƒ˜

แƒฌแƒ˜แƒœแƒ แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜, แƒฏแƒแƒ›แƒจแƒ˜, แƒ•แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒ— 200 แƒฎแƒแƒ–แƒ˜ แƒกแƒแƒญแƒ˜แƒ แƒ 20-แƒ˜แƒก แƒ’แƒฃแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒ 960, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ™แƒ˜แƒ“แƒ”แƒ• แƒฃแƒคแƒ แƒ แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ - แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ?

แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒก แƒชแƒแƒ“แƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒกแƒฃแƒš xnumx แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜. แƒแƒœแƒฃ, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒแƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒœแƒแƒ›, แƒกแƒแƒœแƒแƒ› แƒแƒ  แƒ›แƒ˜แƒ•แƒแƒฆแƒฌแƒ”แƒ•แƒ— แƒกแƒแƒญแƒ˜แƒ แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก.

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 1: แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ

แƒชแƒฎแƒแƒ“แƒ˜แƒ, แƒฉแƒ•แƒ”แƒœแƒ˜ "แƒกแƒแƒ›แƒ˜แƒ–แƒœแƒ”" แƒกแƒ˜แƒ 20 แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜แƒกแƒ’แƒแƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ˜แƒฌแƒงแƒแƒก "แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜" แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ›แƒคแƒšแƒแƒ‘แƒ”แƒšแƒ˜_id แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“ แƒ•แƒžแƒแƒฃแƒšแƒแƒ‘แƒ— แƒแƒกแƒ”แƒ—แƒ”แƒ‘แƒก "แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜" แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒฉแƒแƒ“แƒ”แƒ— แƒกแƒ˜แƒแƒจแƒ˜, แƒ“แƒแƒแƒšแƒแƒ’แƒ”แƒ— แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒ˜ แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒ— - (แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก_แƒ—แƒแƒ แƒ˜แƒฆแƒ˜, id).

SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 2: แƒ˜แƒžแƒแƒ•แƒœแƒ”แƒ— "แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜" แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜

แƒแƒฎแƒšแƒ แƒ—แƒฃ แƒแƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒก แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒ˜แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ— "แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜" แƒฃแƒคแƒ แƒ แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜ แƒ›แƒคแƒšแƒแƒ‘แƒ”แƒšแƒ˜_id-key-แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒ—, แƒ›แƒแƒจแƒ˜แƒœ แƒงแƒ•แƒ”แƒšแƒ แƒœแƒแƒžแƒแƒ•แƒœแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜แƒ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒจแƒ”แƒ แƒฉแƒ”แƒ•แƒ˜แƒกแƒแƒก. แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒœแƒแƒ› แƒแƒ  แƒ’แƒแƒ“แƒแƒ•แƒ™แƒ•แƒ”แƒ—แƒ— แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒก แƒ›แƒ”แƒแƒ แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒกแƒ˜แƒแƒจแƒ˜.

แƒ—แƒฃ แƒแƒฆแƒ›แƒแƒฉแƒœแƒ“แƒ, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ "แƒ’แƒแƒ“แƒแƒ™แƒ•แƒ”แƒ—แƒ”แƒ—" แƒ›แƒ”แƒแƒ แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ‘แƒแƒšแƒ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ”แƒ›แƒแƒขแƒแƒก แƒกแƒ˜แƒแƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ (แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ›แƒคแƒšแƒแƒ‘แƒ”แƒšแƒ˜_id-แƒ˜แƒ—), แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒแƒช แƒกแƒ˜แƒ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ.

SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ

แƒแƒœแƒฃ, แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ•แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ› แƒกแƒ˜แƒแƒก แƒแƒ  แƒแƒฅแƒ•แƒก แƒ”แƒ แƒ—แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ—แƒฃ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ“แƒ แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒแƒ  "แƒ’แƒแƒ“แƒแƒ™แƒ•แƒ”แƒ—แƒ", แƒ›แƒแƒจแƒ˜แƒœ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒฅแƒ แƒ”แƒ‘แƒ แƒกแƒ˜แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ“แƒแƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ. ), แƒ“แƒ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ–แƒ แƒ“แƒแƒ“แƒ˜ แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒ— (แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก_แƒ—แƒแƒ แƒ˜แƒฆแƒ˜, ID).

SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ

แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ 3: แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒคแƒ˜แƒšแƒขแƒ•แƒ แƒ แƒ“แƒ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒฃแƒšแƒ˜ แƒจแƒ”แƒ แƒฉแƒ”แƒ•แƒ˜แƒก แƒ แƒ˜แƒ’แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ rv แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ - แƒฏแƒ”แƒ  แƒ•แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒกแƒ”แƒ—แƒก, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ โ€žแƒกแƒ˜แƒ˜แƒก แƒ›แƒ”-2 แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ™แƒ•แƒ”แƒ—แƒโ€œ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ˜ แƒ›แƒแƒก แƒ•แƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ‘แƒ— แƒกแƒ˜แƒ˜แƒ“แƒแƒœ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒแƒ“แƒ’แƒ˜แƒšแƒ–แƒ”. แƒแƒกแƒ” แƒ แƒแƒ›, แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ’แƒแƒคแƒ˜แƒšแƒขแƒ แƒฃแƒšแƒ˜.

แƒกแƒแƒจแƒ˜แƒœแƒ”แƒšแƒ˜ แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ

WITH RECURSIVE T AS (
  -- #1 : ะทะฐะฝะพัะธะผ ะฒ ัะฟะธัะพะบ "ะฟะตั€ะฒั‹ะต" ะทะฐะฟะธัะธ ะฟะพ ะบะฐะถะดะพะผัƒ ะธะท ะบะปัŽั‡ะตะน ะฝะฐะฑะพั€ะฐ
  WITH wrap AS ( -- "ะผะฐั‚ะตั€ะธะฐะปะธะทัƒะตะผ" record'ั‹, ั‡ั‚ะพะฑั‹ ะพะฑั€ะฐั‰ะตะฝะธะต ะบ ะฟะพะปัะผ ะฝะต ะฒั‹ะทั‹ะฒะฐะปะพ ัƒะผะฝะพะถะตะฝะธั InitPlan/SubPlan
    WITH T AS (
      SELECT
        (
          SELECT
            r
          FROM
            task r
          WHERE
            owner_id = unnest
          ORDER BY
            task_date, id
          LIMIT 1
        ) r
      FROM
        unnest('{1,2,4,8,16,32,64,128,256,512}'::integer[])
    )
    SELECT
      array_agg(r ORDER BY (r).task_date, (r).id) list -- ัะพั€ั‚ะธั€ัƒะตะผ ัะฟะธัะพะบ ะฒ ะฝัƒะถะฝะพะผ ะฟะพั€ัะดะบะต
    FROM
      T
  )
  SELECT
    list
  , list[1] rv
  , FALSE not_cross
  , 0 size
  FROM
    wrap
UNION ALL
  -- #2 : ะฒั‹ั‡ะธั‚ั‹ะฒะฐะตะผ ะทะฐะฟะธัะธ 1-ะณะพ ะฟะพ ะฟะพั€ัะดะบัƒ ะบะปัŽั‡ะฐ, ะฟะพะบะฐ ะฝะต ะฟะตั€ะตัˆะฐะณะฝะตะผ ั‡ะตั€ะตะท ะทะฐะฟะธััŒ 2-ะณะพ
  SELECT
    CASE
      -- ะตัะปะธ ะฝะธั‡ะตะณะพ ะฝะต ะฝะฐะนะดะตะฝะพ ะดะปั ะบะปัŽั‡ะฐ 1-ะน ะทะฐะฟะธัะธ
      WHEN X._r IS NOT DISTINCT FROM NULL THEN
        T.list[2:] -- ัƒะฑะธั€ะฐะตะผ ะตะต ะธะท ัะฟะธัะบะฐ
      -- ะตัะปะธ ะผั‹ ะะ• ะฟะตั€ะตัะตะบะปะธ ะฟั€ะธะบะปะฐะดะฝะพะน ะบะปัŽั‡ 2-ะน ะทะฐะฟะธัะธ
      WHEN X.not_cross THEN
        T.list -- ะฟั€ะพัั‚ะพ ะฟั€ะพั‚ัะณะธะฒะฐะตะผ ั‚ะพั‚ ะถะต ัะฟะธัะพะบ ะฑะตะท ะผะพะดะธั„ะธะบะฐั†ะธะน
      -- ะตัะปะธ ะฒ ัะฟะธัะบะต ัƒะถะต ะฝะตั‚ 2-ะน ะทะฐะฟะธัะธ
      WHEN T.list[2] IS NULL THEN
        -- ะฟั€ะพัั‚ะพ ะฒะพะทะฒั€ะฐั‰ะฐะตะผ ะฟัƒัั‚ะพะน ัะฟะธัะพะบ
        '{}'
      -- ะฟะตั€ะตัะพั€ั‚ะธั€ะพะฒั‹ะฒะฐะตะผ ัะปะพะฒะฐั€ัŒ, ัƒะฑะธั€ะฐั 1-ัŽ ะทะฐะฟะธััŒ ะธ ะดะพะฑะฐะฒะปัั ะฟะพัะปะตะดะฝัŽัŽ ะธะท ะฝะฐะนะดะตะฝะฝั‹ั…
      ELSE (
        SELECT
          coalesce(T.list[2] || array_agg(r ORDER BY (r).task_date, (r).id), '{}')
        FROM
          unnest(T.list[3:] || X._r) r
      )
    END
  , X._r
  , X.not_cross
  , T.size + X.not_cross::integer
  FROM
    T
  , LATERAL(
      WITH wrap AS ( -- "ะผะฐั‚ะตั€ะธะฐะปะธะทัƒะตะผ" record
        SELECT
          CASE
            -- ะตัะปะธ ะฒัะต-ั‚ะฐะบะธ "ะฟะตั€ะตัˆะฐะณะฝัƒะปะธ" ั‡ะตั€ะตะท 2-ัŽ ะทะฐะฟะธััŒ
            WHEN NOT T.not_cross
              -- ั‚ะพ ะฝัƒะถะฝะฐั ะทะฐะฟะธััŒ - ะฟะตั€ะฒะฐั ะธะท ัะฟะฟะธัะบะฐ
              THEN T.list[1]
            ELSE ( -- ะตัะปะธ ะฝะต ะฟะตั€ะตัะตะบะปะธ, ั‚ะพ ะบะปัŽั‡ ะพัั‚ะฐะปัั ะบะฐะบ ะฒ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ะทะฐะฟะธัะธ - ะพั‚ั‚ะฐะปะบะธะฒะฐะตะผัั ะพั‚ ะฝะตะต
              SELECT
                _r
              FROM
                task _r
              WHERE
                owner_id = (rv).owner_id AND
                (task_date, id) > ((rv).task_date, (rv).id)
              ORDER BY
                task_date, id
              LIMIT 1
            )
          END _r
      )
      SELECT
        _r
      , CASE
          -- ะตัะปะธ 2-ะน ะทะฐะฟะธัะธ ัƒะถะต ะฝะตั‚ ะฒ ัะฟะธัะบะต, ะฝะพ ะผั‹ ั…ะพั‚ัŒ ั‡ั‚ะพ-ั‚ะพ ะฝะฐัˆะปะธ
          WHEN list[2] IS NULL AND _r IS DISTINCT FROM NULL THEN
            TRUE
          ELSE -- ะฝะธั‡ะตะณะพ ะฝะต ะฝะฐัˆะปะธ ะธะปะธ "ะฟะตั€ะตัˆะฐะณะฝัƒะปะธ"
            coalesce(((_r).task_date, (_r).id) < ((list[2]).task_date, (list[2]).id), FALSE)
        END not_cross
      FROM
        wrap
    ) X
  WHERE
    T.size < 20 AND -- ะพะณั€ะฐะฝะธั‡ะธะฒะฐะตะผ ั‚ัƒั‚ ะบะพะปะธั‡ะตัั‚ะฒะพ
    T.list IS DISTINCT FROM '{}' -- ะธะปะธ ะฟะพะบะฐ ัะฟะธัะพะบ ะฝะต ะบะพะฝั‡ะธะปัั
)
-- #3 : "ั€ะฐะทะฒะพั€ะฐั‡ะธะฒะฐะตะผ" ะทะฐะฟะธัะธ - ะฟะพั€ัะดะพะบ ะณะฐั€ะฐะฝั‚ะธั€ะพะฒะฐะฝ ะฟะพ ะฟะพัั‚ั€ะพะตะฝะธัŽ
SELECT
  (rv).*
FROM
  T
WHERE
  not_cross; -- ะฑะตั€ะตะผ ั‚ะพะปัŒะบะพ "ะฝะตะฟะตั€ะตัะตะบะฐัŽั‰ะธะต" ะทะฐะฟะธัะธ

SQL HowTo: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— while-แƒชแƒ˜แƒ™แƒšแƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜, แƒแƒœ โ€žแƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒกแƒแƒ›แƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜โ€œ
[แƒœแƒแƒฎแƒ”แƒ— description.tensor.ru]

แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒแƒฎแƒ“แƒ˜แƒœแƒ”แƒก 50% แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ 20% แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒ–แƒ”. แƒแƒœแƒฃ, แƒ—แƒฃ แƒ’แƒแƒฅแƒ•แƒ— แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ˜ แƒ˜แƒ›แƒ˜แƒก แƒ“แƒแƒกแƒแƒฏแƒ”แƒ แƒ”แƒ‘แƒšแƒแƒ“, แƒ แƒแƒ› แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ’แƒ แƒซแƒ”แƒšแƒ˜ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒแƒ  แƒแƒ แƒ˜แƒก แƒฅแƒ”แƒจแƒจแƒ˜ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒ“แƒ˜แƒกแƒ™แƒ–แƒ” แƒฃแƒœแƒ“แƒ แƒฌแƒแƒฎแƒ•แƒ˜แƒ“แƒ”แƒ—), แƒ›แƒแƒจแƒ˜แƒœ แƒแƒ› แƒ’แƒ–แƒ˜แƒ— แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ”แƒงแƒ แƒ“แƒœแƒแƒ— แƒœแƒแƒ™แƒšแƒ”แƒ‘ แƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒก.

แƒงแƒแƒ•แƒ”แƒš แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜ แƒแƒฆแƒ›แƒแƒฉแƒœแƒ“แƒ, แƒ•แƒ˜แƒ“แƒ แƒ” "แƒ’แƒฃแƒšแƒฃแƒ‘แƒ แƒงแƒ•แƒ˜แƒšแƒ" แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒจแƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ› 3 แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜แƒ“แƒแƒœ แƒ แƒแƒ›แƒ”แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ, แƒจแƒ”แƒœแƒ–แƒ”แƒ แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ