{"id":467537,"date":"2025-07-18T22:30:35","date_gmt":"2025-07-18T22:30:35","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467537"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467537","title":{"rendered":"<span>\u00abIT-\u041f\u043b\u0430\u043d\u0435\u0442\u0430 2025\u00bb: \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043f\u043e PostgreSQL<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b \u043c\u044b, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0440\u0435\u0448\u0430\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 \u043d\u0430 SQL, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439. \u0427\u0435\u043c \u043a\u043e\u0440\u043e\u0447\u0435 \u2014 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412 \u0434\u0435\u0442\u0441\u0442\u0432\u0435 \u043c\u044b \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u043c \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445 \u0438 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u043d\u0430 SQL. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0432 \u044d\u0442\u043e\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0438 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0445\u0432\u0430\u0442\u0438\u0442, \u0430 \u0442\u0443\u0442 \u043c\u044b \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u0441\u044f.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442\u044c, \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u2014 \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u2014 \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u0421\u0440\u0430\u0437\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0438 \u0441 \u043e\u0434\u043d\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2014 \u043b\u0435\u0433\u043a\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u00ab\u043f\u043e-\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u00bb, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0432\u0435\u0442\u043d\u044b\u0435 \u0431\u0430\u043b\u043b\u044b. \u041d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443, \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u0443\u044e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0447\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0438, \u0447\u0435\u043c \u0422\u044c\u044e\u0440\u0438\u043d\u0433 \u043d\u0435 \u0448\u0443\u0442\u0438\u0442, \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u0438\u043a-\u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u041c\u044b \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0431\u043b\u0430\u0433\u0430\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0418\u0418. \u041d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u044e\u0442, \u043d\u043e, \u0447\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0436\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u0441\u0442\u0432\u0430. \u0412\u043e\u0442 \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c. \u0418 \u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u0418\u0418, \u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u041d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u044b\u0435, \u0438 \u0431\u0435\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u044b \u043d\u0430 \u043f\u043b\u0435\u0447\u0430\u0445 \u0438\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c (\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e. \u0415\u0441\u043b\u0438 \u0444\u0438\u043d\u0430\u043b\u0438\u0441\u0442\u044b \u043c\u0435\u043d\u044f \u0447\u0438\u0442\u0430\u044e\u0442, \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0438 \u0432\u044b \u0418\u0418, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u0432\u0430\u043c \u043f\u043e\u043c\u043e\u0433 \u0438\u043b\u0438, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u043b?<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a \u0437\u0430\u0434\u0430\u0447\u0430\u043c. \u0418\u0445 \u0431\u044b\u043b\u043e \u0442\u0440\u0438.<\/p>\n<h2>1. \u041a\u0432\u0430\u0439\u043d<\/h2>\n<h3>\u0423\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0432\u043f\u0430\u0441\u0442\u044c \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0444\u043e\u0440\u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0422\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439.<\/p>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0448\u043b\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u043c\u0438\u043d\u043a\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043b\u0435\u0433\u043a\u043e \u0433\u0443\u0433\u043b\u0438\u0442\u0441\u044f. \u041f\u0435\u0440\u0432\u0430\u044f \u0436\u0435 <a href=\"https:\/\/stackoverflow.com\/questions\/4006189\/quine-self-producing-sql-query\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 SO<\/a> \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0437 130 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">SELECT left(v,61)||chr(39)||v||chr(39)||right(v,3)FROM(SELECT'SELECT left(v,61)||chr(39)||v||chr(39)||right(v,3)FROM(SELECTv);'v);<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 (\u0442\u0438\u043f\u0430 \u041f\u0438\u0442\u043e\u043d\u0430), \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a \u0441\u0430\u043c\u0438\u0445 \u0432 \u0441\u0435\u0431\u044f. \u0412\u043e\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Quine_(computing)\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>:<\/p>\n<pre><code class=\"python\">b = 'b = %s%s%s; print(b %% (chr(39), b, chr(39)))'; print(b % (chr(39), b, chr(39)))<\/code><\/pre>\n<p>\u041d\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0432 \u041f\u043e\u0441\u0442\u0433\u0440\u0435\u0441\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>format<\/code>. \u0417\u0430\u043e\u0434\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u0438 \u043e\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0442\u043e\u0447\u043a\u0438 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 102 \u0441\u0438\u043c\u0432\u043e\u043b\u0430:<\/p>\n<pre><code class=\"pgsql\">SELECT format(v,chr(39),v,chr(39))FROM(SELECT'SELECT format(v,chr(39),v,chr(39))FROM(SELECT%s%s%sv)'v)<\/code><\/pre>\n<p>\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u043b\u0430\u0445\u043e\u0442\u043d\u0438\u043a\u043e\u0432 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a, \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>%L<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u0441\u0430\u043c. \u042d\u0442\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435, 70 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">SELECT format(f,f)FROM(SELECT'SELECT format(f,f)FROM(SELECT%L f)f' f)f<\/code><\/pre>\n<p>\u041d\u043e \u0438 \u044d\u0442\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043e <code>FROM<\/code> \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u043e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u0435\u0435 \u0436\u0435 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0418 \u0442\u0430\u043a\u0430\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0441\u0442\u044c \u2014 \u044d\u0442\u043e <code>trim<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <strong>64\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430:<\/strong><\/p>\n<pre><code class=\"pgsql\">SELECT format(f,f)FROM trim('SELECT format(f,f)FROM trim(%L)f')f<\/code><\/pre>\n<p>\u0414\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0441\u044f, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u0440\u043e\u0447\u0435 \u2014 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0410 \u043d\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0410\u0440\u0442\u0435\u043c \u0421\u0443\u0445\u043e\u0432, \u043e\u0431\u043e\u0439\u0434\u044f\u0441\u044c \u043e\u0434\u043d\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c <code>format<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0432\u0443\u0445 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0445\u0438\u0442\u0440\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 (68 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432):<\/p>\n<pre><code class=\"pgsql\">SELECT format('SELECT format(%1$L,%1$L)','SELECT format(%1$L,%1$L)')<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u0443\u0440\u044c\u0435\u0437\u043d\u043e\u0433\u043e. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0441\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u043b\u0438, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>current_query<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u041c\u043e\u043b\u043e\u0434\u0446\u044b, \u044f \u043f\u0440\u043e \u043d\u0435\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0437\u0430\u0431\u044b\u043b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0442\u0432\u0435\u0440\u0433\u043b\u0430 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 <code>WITH<\/code>), \u0438 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u0434\u0443\u0445\u0443 \u043a\u0432\u0430\u0439\u043d\u043e\u0432. \u0427\u0435\u0441\u0442\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442, \u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<h2>2. \u041b\u0443\u0436\u0438<\/h2>\n<h3>\u0423\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>elevation<\/code> \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u044b\u0441\u043e\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430: <\/p>\n<pre><code class=\"pgsql\">CREATE TABLE elevation(   x integer PRIMARY KEY,               -- \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 x   h integer CHECK (h BETWEEN 0 AND 10) -- \u0432\u044b\u0441\u043e\u0442\u0430 );<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430, \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u0441\u043e\u0442\u0430 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e. \u041e\u0431\u0449\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0442\u044b\u0441\u044f\u0447\u0438. <\/p>\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0434\u044b \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0436\u0434\u044f \u0432 \u043b\u0443\u0436\u0430\u0445?<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0438\u0306 \u043e\u0442\u0432\u0435\u0442 4: <\/p>\n<pre><code class=\"pgsql\">INSERT INTO elevation VALUES (-5,1), (-3,2), (-2,3), (-1,1), (1,2);<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/33e\/d91\/6e2\/33ed916e2992f1893a3777a7080a4d4e.png\" width=\"1737\" height=\"396\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/33e\/d91\/6e2\/33ed916e2992f1893a3777a7080a4d4e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/33e\/d91\/6e2\/33ed916e2992f1893a3777a7080a4d4e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0418\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f <a href=\"https:\/\/leetcode.com\/problems\/trapping-rain-water\/description\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0434\u0430\u0447\u0430 \u0441 \u043b\u0438\u0442\u043a\u043e\u0434\u0430<\/a>. \u041e\u0431 \u044d\u0442\u043e\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0435\u0449\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0437\u0432\u0435\u0437\u0434\u043d\u044b\u0439 \u0447\u0430\u0441 \u0418\u0418. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a, \u0441\u043a\u0430\u0436\u0435\u043c, DeepSeek \u043f\u0440\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u043b\u0443\u0436\u0430\u0445 \u0442\u0443\u0442 \u0436\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u0438 \u0441\u0430\u043c\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u041f\u0438\u0442\u043e\u043d\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <em>O<\/em>(<em>n<\/em>) \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 <em>O<\/em>(1) \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u043e\u043f\u0440\u043e\u0441 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435. \u0418-\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u0438 \u0442\u0443\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442, \u043d\u043e \u0443\u0436\u0435 \u043d\u0430\u0447\u043d\u0435\u0442 \u043f\u043b\u0430\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u0443.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u044f\u0442 \u043d\u0430 \u043b\u0435\u0432\u043e\u0439 \u0438 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u0442\u044f\u0433\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e) \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f, \u0430 <code>array_agg<\/code> \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u0434\u0430\u0436\u0435 \u0437\u0432\u0443\u0447\u0438\u0442 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e; \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e (\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0438\u043d\u043a\u0438).<\/p>\n<p>\u0421\u0443\u0442\u044c \u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0432\u043e\u0434\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0435\u043d \u043f\u043e \u0431\u043e\u043a\u0430\u043c \u043e\u0442 \u043a\u043b\u0435\u0442\u043a\u0438 (\u043a\u0430\u043a \u0441\u043b\u0435\u0432\u0430, \u0442\u0430\u043a \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043d\u0435\u0435) \u043d\u0430\u0434 \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \u0432 \u0441\u0430\u043c\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435. \u0414\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0443\u0436\u043d\u044b \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438, \u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438\u0445 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb \u043f\u043e \u043c\u0435\u0440\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u041d\u043e \u0432\u0435\u0434\u044c \u0432 SQL \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u2014 \u0432\u043e\u0442 \u0438\u0445 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u044b\u0441\u043e\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u0435\u043d, \u0430 \u043d\u0430\u0448\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u043b\u0438\u043a\u0432\u0438\u0434\u0438\u0440\u0443\u0435\u043c.<\/p>\n<p>\u041d\u0430\u0434\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 (\u043d\u0435\u043b\u044c\u0437\u044f \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c, \u0432\u0437\u044f\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440). \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"pgsql\">SELECT g.x, coalesce(e.h,0) FROM \u00a0\u00a0(SELECT min(x) minx, max(x) maxx FROM elevation), \u00a0\u00a0generate_series(minx,maxx) g(x) \u00a0\u00a0LEFT JOIN elevation e ON e.x = g.x;<\/code><\/pre>\n<pre><code> x  | coalesce ----+----------  -5 |    1  -4 |    0  -3 |    2  -2 |    3  -1 |    1   0 |    0   1 |    2 (7 rows)<\/code><\/pre>\n<p>\u041c\u043d\u043e\u0433\u043e\u0432\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442. \u041d\u0430\u0434\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432 (\u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u044b\u0431\u0438\u0440\u0430\u044f \u043e\u0434\u043d\u043e\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043f\u043e\u043a\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0443\u043a\u0432), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"pgsql\">SELECT x, coalesce(h,0) FROM (   SELECT generate_series(min(x), max(x)) x FROM elevation ) LEFT JOIN elevation USING(x);<\/code><\/pre>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 PostgreSQL 16 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u043e <code>FROM<\/code> \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u2014 \u043c\u043d\u043e\u0433\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0443\u0447\u043b\u0438 \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u0438\u043a\u0438. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435 \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 (<code>x<\/code>) \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 <code>USING<\/code>.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442\u0438\u043a \u0437\u0430 \u0441\u0447\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0436\u0435 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0441\u043b\u043e\u0432\u0430 <code>NATURAL<\/code>:<\/p>\n<pre><code class=\"pgsql\">SELECT x, coalesce(h,0) h FROM (   SELECT generate_series(min(x), max(x)) x FROM elevation ) NATURAL LEFT JOIN elevation;<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0441\u044c \u043d\u0430 \u0432\u0441\u0435\u043c \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430. \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u043a\u043b\u0435\u0442\u043a\u0438 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0430\u043c\u0443 \u043a\u043b\u0435\u0442\u043a\u0443) \u043d\u0430\u043c \u0434\u0430\u0441\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u043a\u043d\u0430 <code>OVER (ORDER BY x)<\/code>, \u0430 \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u043a\u043d\u0430 <code>OVER (ORDER BY x DESC)<\/code>:<\/p>\n<pre><code class=\"pgsql\">WITH m AS (   SELECT x, coalesce(h,0) h FROM (     SELECT generate_series(min(x), max(x)) x FROM elevation   )   NATURAL LEFT JOIN elevation ), a AS (   SELECT h, max(h) OVER (ORDER BY x) l,   max(h) OVER (ORDER BY x DESC) r   FROM m ) SELECT * FROM a;<\/code><\/pre>\n<pre><code> h | l | r ---+---+---  1 | 1 | 3  0 | 1 | 3  2 | 2 | 3  3 | 3 | 3  1 | 3 | 2  0 | 3 | 2  2 | 3 | 2 (7 rows)<\/code><\/pre>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0440\u0430\u0432\u0434\u0443 \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043b\u0435\u0432\u0430 \u0440\u0430\u0441\u0442\u0435\u0442, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043f\u0440\u0430\u0432\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f (\u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435! \u2014 \u043f\u043e\u0432\u0442\u043e\u0440\u044e \u0435\u0435).<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/16a\/6ed\/4d5\/16a6ed4d54da2497274fb4c48d527477.png\" width=\"1737\" height=\"396\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/16a\/6ed\/4d5\/16a6ed4d54da2497274fb4c48d527477.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/16a\/6ed\/4d5\/16a6ed4d54da2497274fb4c48d527477.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b (<code>least(p,q)-h<\/code>) \u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"pgsql\">WITH m AS (   SELECT x, coalesce(h,0) h FROM (     SELECT generate_series(min(x), max(x)) x FROM elevation   )   NATURAL LEFT JOIN elevation ), a AS (   SELECT h, max(h) OVER (ORDER BY x) l,   max(h) OVER (ORDER BY x DESC) r   FROM m ) SELECT coalesce(sum(least(l,r)-h),0) FROM a;<\/code><\/pre>\n<pre><code> coalesce ----------     4 (1 row)<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>coalesce<\/code>: \u043e\u043d \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c 0.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0443\u044e \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0415\u0432\u0433\u0435\u043d\u0438\u0439 \u0416\u0430\u0431\u043a\u043e: \u0432\u043c\u0435\u0441\u0442\u043e <code>ORDER BY x DESC<\/code> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>ORDER BY-x<\/code>. \u041f\u044f\u0442\u044c \u0431\u0430\u0439\u0442 \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0435 \u043d\u0435 \u0432\u0430\u043b\u044f\u044e\u0442\u0441\u044f!<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 CTE \u0432 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0442\u043e\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0418\u0432\u0430\u043d\u0430 \u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432\u0430 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0435 202 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 (\u0441\u0430\u043c \u0418\u0432\u0430\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043b 208, \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u043e):<\/p>\n<pre><code class=\"pgsql\">SELECT COALESCE(SUM(LEAST(l,r)-d),0)FROM(SELECT h,COALESCE(h,0)d,MAX(h)OVER(ORDER BY x)l,MAX(h)OVER(ORDER BY-x)r FROM(SELECT generate_series(min(x),max(x))x FROM elevation)x NATURAL LEFT JOIN elevation)<\/code><\/pre>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u044d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u043e\u0432.<\/p>\n<p>* * *<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u0433\u0430\u0447\u0435. \u041a\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u043b \u043d\u0430\u0434 \u043d\u0435\u0439, \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443, \u0447\u0442\u043e \u0441\u0430\u043c-\u0442\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u044b. \u042f \u0432\u043e\u0437\u044c\u043c\u0443 \u043b\u0438\u0441\u0442 \u0432 \u043a\u043b\u0435\u0442\u043a\u0443, \u0437\u0430\u043a\u0440\u0430\u0448\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0438-\u0441\u0442\u0435\u043d\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u044e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c <em>\u043c\u0435\u0436\u0434\u0443<\/em> \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u043d\u0430 SQL? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u043d\u0430\u0448\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"pgsql\">WITH m AS (   SELECT x, coalesce(h,0) h FROM (     SELECT generate_series(min(x), max(x)) x FROM elevation   )   NATURAL LEFT JOIN elevation ), a AS (   SELECT d, string_agg(chr(65+(h&lt;d)::int),'' ORDER BY x) s   FROM m, generate_series(1,10) d   GROUP BY d ) SELECT * FROM a ORDER BY d DESC;<\/code><\/pre>\n<pre><code> d  |s     ----+---------  10 | BBBBBBB   9 | BBBBBBB   8 | BBBBBBB   7 | BBBBBBB   6 | BBBBBBB   5 | BBBBBBB   4 | BBBBBBB   3 | BBBABBB   2 | BBAABBA   1 | ABAAABA (10 rows)<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c A \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0441\u0442\u0435\u043d\u044b, \u0430 B \u2014 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u0442\u0435 B, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u043a\u0440\u0430\u044f\u043c, \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<pre><code class=\"pgsql\">WITH m AS (   SELECT x, coalesce(h,0) h FROM (     SELECT generate_series(min(x), max(x)) x FROM elevation   )   NATURAL LEFT JOIN elevation ), a AS (   SELECT d, string_agg(chr(65+(h&lt;d)::int),'' ORDER BY x) s   FROM m, generate_series(1,10) d   GROUP BY d ) SELECT coalesce(sum(length(replace(trim(s,'B'),'A',''))),0) FROM a;<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c 287 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">WITH m AS(SELECT x,coalesce(h,0)h FROM(SELECT generate_series(min(x),max(x))x FROM elevation)NATURAL LEFT JOIN elevation),a AS(SELECT d,string_agg(chr(65+(h&lt;d)::int),''ORDER BY x)s FROM m,generate_series(1,10)d GROUP BY d)SELECT coalesce(sum(length(replace(trim(s,'B'),'A',''))),0)FROM a<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0435\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c\u0441\u044f, \u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u043e\u0432. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0410\u0440\u0442\u0435\u043c \u041d\u0430\u0437\u0430\u0440\u043e\u0432 \u043f\u043e\u0448\u0435\u043b \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0441\u044f, \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437 \u0448\u0438\u0440\u0438\u043d\u044b \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044e\u0449\u0438\u0445 \u044d\u0442\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0438 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u044e\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043c\u0435\u0445\u043e\u0439. \u0418 \u0432\u0443\u0430\u043b\u044f \u2014 \u0440\u0435\u043a\u043e\u0440\u0434 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f, 179 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432!<\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0410\u0440\u0442\u0435\u043c\u0430 \u0432 \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"pgsql\">SELECT coalesce(sum(a),0) FROM(   SELECT(max(x)-min(x)+1)-cardinality(array_agg(x))a    FROM elevation      CROSS JOIN(       SELECT generate_series(1,max(h))w FROM elevation     )   WHERE(h&gt;=w)   GROUP BY w )<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043d\u0435\u0445\u0438\u0442\u0440\u044b\u043c\u0438 \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 (\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <code>CROSS JOIN<\/code> \u043d\u0430 \u0437\u0430\u043f\u044f\u0442\u0443\u044e, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 \u0432\u044b\u0441\u043e\u0442\u044b \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 10, \u0443\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u043d\u0430 \u0441\u0442\u0440\u043e\u0433\u043e\u0435) \u0434\u043e \u0432\u0441\u0435\u0433\u043e-\u043d\u0430\u0432\u0441\u0435\u0433\u043e <strong>139 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432!<\/strong><\/p>\n<pre><code class=\"pgsql\">SELECT coalesce(sum(a),0)FROM(SELECT max(x)-min(x)+1-cardinality(array_agg(x))a FROM elevation,generate_series(0,10)w WHERE h&gt;w GROUP BY w)<\/code><\/pre>\n<p>\u041d\u0443 \u0447\u0442\u043e, \u043a\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435?<\/p>\n<h2>3. \u041b\u0443\u0436\u0438 3D<\/h2>\n<h3>\u0423\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>elevation3d<\/code> \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u044b\u0441\u043e\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0433\u043e \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430: <\/p>\n<pre><code class=\"pgsql\">CREATE TABLE elevation3d(   x integer,                           -- \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 x   y integer,                           -- \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 y   PRIMARY KEY (x,y),   h integer CHECK (h BETWEEN 0 AND 10) -- \u0432\u044b\u0441\u043e\u0442\u0430 );<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430, \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u0441\u043e\u0442\u0430 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e. \u041e\u0431\u0449\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0438 \u043e\u0431\u0449\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0442 \u043f\u044f\u0442\u0438\u0434\u0435\u0441\u044f\u0442\u0438. <\/p>\n<p>\u041f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u043c \u0432\u043e\u0434\u0430 \u043d\u0435 \u0442\u0435\u0447\u0435\u0442. \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0434\u044b \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0436\u0434\u044f \u0432 \u043b\u0443\u0436\u0430\u0445? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0438\u0306 \u043e\u0442\u0432\u0435\u0442 2: <\/p>\n<pre><code class=\"pgsql\">INSERT INTO elevation3d VALUES            (3,3,3), (4,3,3),   (2,4,2),                   (5,4,2),             (3,5,1), (4,5,2);<\/code><\/pre>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b04\/ac1\/f14\/b04ac1f14934dabda264e178a818d682.png\" width=\"1737\" height=\"675\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b04\/ac1\/f14\/b04ac1f14934dabda264e178a818d682.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b04\/ac1\/f14\/b04ac1f14934dabda264e178a818d682.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u042d\u0442\u043e \u0442\u043e\u0436\u0435 <a href=\"https:\/\/leetcode.com\/problems\/trapping-rain-water-ii\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0434\u0430\u0447\u0430 \u0441 \u043b\u0438\u0442\u043a\u043e\u0434\u0430<\/a>. \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f: \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u043e\u0442 \u043a\u043b\u0435\u0442\u043a\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0443\u0442\u0435\u0447\u044c \u0438\u0437 \u043d\u0435\u0435 \u0438\u0437\u0432\u0438\u043b\u0438\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0435\u043c.<\/p>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_%D1%81_%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82%D0%BE%D0%BC_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\" rel=\"noopener noreferrer nofollow\">\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432\u0441\u0435 \u043a\u043b\u0435\u0442\u043a\u0438, \u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430. \u0417\u0430\u0442\u0435\u043c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u0437\u044b\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0430\u044f \u043d\u0438\u0437\u043a\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430, \u0430 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0435\u0442\u043a\u0438. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432\u044b\u0441\u043e\u0442\u044b \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a, \u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0434\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u044b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0435.<\/p>\n<p>\u0412 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043a\u0443\u0447\u0438<\/a>. \u0412 SQL \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e-\u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0441\u044b\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c; \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u0443 \u043d\u0430\u0441 \u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u043c. \u0425\u0443\u0436\u0435 \u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u0435\u0441\u044c\u043c\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043c (\u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0438\u043d\u043a\u0438; \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u0435\u0435 800 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432).<\/p>\n<p>\u0421\u043d\u043e\u0432\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0434\u043b\u044f SQL. \u0427\u0442\u043e \u0438 \u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0434\u043e \u0434\u0443\u043c\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432\u0435\u0434\u044c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0431\u0435\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u0412\u043e\u0434\u0430 \u0432\u044b\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u0440\u0430\u0435\u0432 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043e\u0434\u043d\u0443 \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043b\u0435\u0442\u043a\u0443 \u0441 \u043a\u0440\u0430\u044e \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443: \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043b\u0438\u0442\u044c \u0432\u043e\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u044c \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443. \u0412\u043e\u0434\u0430 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u043d\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0435 \u043a\u043b\u0435\u0442\u043a\u0438, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0435. \u042d\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0441\u0432\u044f\u0437\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0441 \u044d\u0442\u0438\u043c \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/746094\/\" rel=\"noopener noreferrer nofollow\">\u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u0440\u043e \u0413\u043e<\/a>.<\/p>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u0440\u0430\u0439\u043d\u0438\u0445 \u043a\u043b\u0435\u0442\u043e\u043a. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043d\u0430\u0431\u043e\u0440 \u0432\u044b\u0441\u043e\u0442 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0435\u0435 \u0432\u043e\u0434\u044b; \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043d\u0430\u0434\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0441\u043e\u0442 \u0432\u043e\u0434\u044b \u0438 \u0434\u043d\u0430.<\/p>\n<p>\u0417\u0430 \u0434\u0435\u043b\u043e. \u041d\u0430\u0447\u043d\u0435\u043c, \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435, \u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u0432. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0440\u0435\u0448\u0438\u0432\u0448\u0438\u0435 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<pre><code class=\"pgsql\">WITH RECURSIVE m AS(   SELECT min(x) a, max(x) b, min(y) c, max(y) d FROM elevation3d ), a AS(   SELECT x,y,coalesce(h,0) h    FROM(     SELECT x,y FROM m, generate_series(a,b)x, generate_series(c,d)y   ) NATURAL LEFT JOIN elevation3d ) SELECT * FROM a;<\/code><\/pre>\n<pre><code> x | y | h ---+---+---  2 | 3 | 0  2 | 4 | 2  2 | 5 | 0  3 | 3 | 3  3 | 4 | 0  3 | 5 | 1  4 | 3 | 3  4 | 4 | 0  4 | 5 | 2  5 | 3 | 0  5 | 4 | 2  5 | 5 | 0 (12 rows)<\/code><\/pre>\n<p>\u0425\u043e\u0442\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441 <code>a<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u043a\u043e\u0440\u043e\u0447\u0435, \u0431\u0435\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"pgsql\">a AS(   SELECT x,y,coalesce(h,0) h    FROM m, generate_series(a,b)x CROSS JOIN generate_series(c,d)y   NATURAL LEFT JOIN elevation3d )<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<pre><code class=\"pgsql\">WITH RECURSIVE m AS(   SELECT min(x) a, max(x) b, min(y) c, max(y) d FROM elevation3d ), a AS(   SELECT x,y,coalesce(h,0) h    FROM m, generate_series(a,b)x CROSS JOIN generate_series(c,d)y   NATURAL LEFT JOIN elevation3d ), r AS(   -- \u043a\u043b\u0435\u0442\u043a\u0438 \u0441 \u043a\u0440\u0430\u044e   SELECT x,y,h,h l FROM a,m WHERE x IN(a,b) OR y IN(c,d)   UNION   -- \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0433\u043b\u0443\u0431\u044c   SELECT a.x,a.y,a.h,greatest(r.l,a.h)   FROM (VALUES(1,0),(-1,0),(0,1),(0,-1)) d(i,j) CROSS JOIN r JOIN a ON (a.x,a.y)=(r.x+i,r.y+j) ) SELECT x,y,h,min(l),min(l)-h delta FROM r GROUP BY x,y,h;<\/code><\/pre>\n<pre><code> x | y | h | min | delta ---+---+---+-----+-------  2 | 3 | 0 |   0 | 0  4 | 3 | 3 |   3 | 0  4 | 4 | 0 |   1 | 1  5 | 5 | 0 |   0 | 0  3 | 5 | 1 |   1 | 0  2 | 5 | 0 |   0 | 0  2 | 4 | 2 |   2 | 0  3 | 4 | 0 |   1 | 1  4 | 5 | 2 |   2 | 0  5 | 3 | 0 |   0 | 0  3 | 3 | 3 |   3 | 0  5 | 4 | 2 |   2 | 0 (12 rows)<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043b\u044c\u0442\u044b \u0438 \u043e\u0442\u0432\u0435\u0442 \u0433\u043e\u0442\u043e\u0432.<\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 <code>VALUES<\/code>, \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043d\u0430\u0448\u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c <code>a<\/code> \u0438 <code>r<\/code> \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e <code>abs(a.x-r.x)+abs(a.y-r.y)=1<\/code>. \u0415\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<pre><code class=\"pgsql\">WITH RECURSIVE m AS(   SELECT min(x) a, max(x) b, min(y) c, max(y) d FROM elevation3d ), a AS(   SELECT x,y,coalesce(h,0) h    FROM m, generate_series(a,b)x CROSS JOIN generate_series(c,d)y   NATURAL LEFT JOIN elevation3d ), r AS(   SELECT a.*,h l FROM a,m WHERE x IN(a,b) OR y IN(c,d)   UNION   SELECT a.*,greatest(r.l,a.h)   FROM r JOIN a ON abs(a.x-r.x)+abs(a.y-r.y)=1 ) SELECT coalesce(sum(d),0) FROM (SELECT min(l)-h d FROM r GROUP BY x,y,h);<\/code><\/pre>\n<p>\u041f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0432 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u0435 <code>r<\/code> \u043f\u043e\u0440\u0442\u044f\u0442 \u0432\u0441\u044e \u043a\u0440\u0430\u0441\u043e\u0442\u0443, \u043f\u0440\u0430\u0432\u0434\u0430? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u0438 \u043e\u0442 \u043d\u0438\u0445, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0432 \u043f\u043e\u043b\u044f \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u2014 \u044d\u0442\u0438\u043c \u043c\u044b \u0432\u044b\u0438\u0433\u0440\u0430\u0435\u043c \u0430\u0436 4 \u0441\u0438\u043c\u0432\u043e\u043b\u0430.<\/p>\n<pre><code class=\"pgsql\">WITH RECURSIVE m AS(   SELECT min(x) a, max(x) b, min(y) c, max(y) d FROM elevation3d ), a AS(   SELECT x,y,coalesce(h,0) h    FROM m, generate_series(a,b)x CROSS JOIN generate_series(c,d)y   NATURAL LEFT JOIN elevation3d ), r(i,j,k,l) AS(   SELECT a.*,h FROM a,m WHERE x IN(a,b) OR y IN(c,d)   UNION   SELECT a.*,greatest(l,h)   FROM r JOIN a ON abs(x-i)+abs(y-j)=1 ) SELECT coalesce(sum(d),0) FROM (SELECT min(l)-k d FROM r GROUP BY i,j,k);<\/code><\/pre>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c, \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0432 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u0412 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u0441\u0442\u0440\u043e\u043a, \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <strong>401 \u0441\u0438\u043c\u0432\u043e\u043b:<\/strong><\/p>\n<pre><code class=\"pgsql\">WITH RECURSIVE m AS(SELECT min(x)a,max(x)b,min(y)c,max(y)d FROM elevation3d),a AS(SELECT x,y,coalesce(h,0)h FROM m,generate_series(a,b)x CROSS JOIN generate_series(c,d)y NATURAL LEFT JOIN elevation3d),r(i,j,k,l)AS(SELECT a.*,h FROM a,m WHERE x IN(a,b) OR y IN(c,d)UNION SELECT a.*,greatest(l,h) FROM r JOIN a ON abs(x-i)+abs(y-j)=1)SELECT coalesce(sum(d),0)FROM(SELECT-k+min(l)d FROM r GROUP BY i,j,k)<\/code><\/pre>\n<p>\u041a\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435?<\/p>\n<p>\u0410 \u043d\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0443 \u0418\u0432\u0430\u043d\u0430 \u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432\u0430 \u2014 437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u043e\u0434\u0432\u0435\u043b\u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0432\u043e\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430 \u043f\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u0448\u043b\u0438 \u0432 \u043d\u0435\u0439 \u0431\u0440\u0435\u0448\u044c \u2014 \u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0442\u0435\u0441\u0442 \u043d\u0430 \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u0442 1 \u0434\u043e 50. \u0417\u0430 \u0441\u0447\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u0438\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c 62 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0443\u0431\u0440\u0430\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0446 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u0438\u0445 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b. \u0423\u0432\u044b, \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u0430\u043b\u043b\u044b \u043e\u0431\u0440\u0430\u0442\u043d\u043e, \u0430 \u0432\u043f\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0443 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435 \u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u043c\u0430\u0445\u043e\u0432.<\/p>\n<p>* * *<\/p>\n<p>\u0415\u0441\u0442\u044c \u043b\u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e? \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0440\u0435\u0437 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0441\u043e\u0442\u0435. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u043e\u0434\u0430, \u043e\u0441\u0442\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u044d\u0442\u043e \u0432\u043e\u0434\u0430 <em>\u0432\u043d\u0443\u0442\u0440\u0438<\/em> \u0441\u0442\u0435\u043d.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/007\/502\/5df\/0075025df725c4819fb6f788e81ad573.png\" width=\"1737\" height=\"321\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/007\/502\/5df\/0075025df725c4819fb6f788e81ad573.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/007\/502\/5df\/0075025df725c4819fb6f788e81ad573.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0434\u044b, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0443\u0441\u0442\u044b\u0435 \u043a\u043b\u0435\u0442\u043a\u0438, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u043a\u0440\u0430\u044f\u043c\u0438 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430, \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043d\u0435\u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0435. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043d\u0430\u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441 <code>generate_series(1,10)<\/code> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0441\u043e\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438 \u0431\u044b\u043b \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u043e\u0439 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0421\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043e 426 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0447\u0442\u043e, \u0443\u0432\u044b, \u043d\u0435 \u0434\u043e\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u0434\u043e \u0440\u0435\u043a\u043e\u0440\u0434\u0430. \u0412\u043e\u0442 \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u00ab\u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u043c\u00bb \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"pgsql\">WITH RECURSIVE m AS (   SELECT min(x) a, max(x) b, min(y) c, max(y) d FROM elevation3d ), e AS (   SELECT x, y, x IN (a,b) OR y IN (c,d) o, l   FROM m, generate_series(a,b) x CROSS JOIN generate_series(c,d) y NATURAL LEFT JOIN elevation3d JOIN generate_series(1,10) l ON coalesce(h,0) &lt; l ), r(p,q,b,k) AS (   TABLE e   UNION   SELECT x,y,b,l   FROM e JOIN r ON abs(x-p)+abs(y-q)=1 AND l=k ) SELECT count(*) FROM (   SELECT bool_or(b) b   FROM r   GROUP BY p,q,k ) WHERE NOT b<\/code><\/pre>\n<p>\u041b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0432\u043e\u0435\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u041d\u0438\u043a\u0438\u0442\u0430 \u0422\u0438\u0445\u043e\u043d\u043e\u0432\u0438\u0447. \u0422\u043e\u043b\u044c\u043a\u043e \u043e\u043d (\u043a\u0430\u043a \u0438 \u044f \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442 \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0443\u0442 \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u0440\u0435\u0437, \u041d\u0438\u043a\u0438\u0442\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u0438\u0442\u0440\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0410 \u0437\u0430\u0442\u0435\u043c \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0435\u0442\u043e\u043a, \u0441\u043e\u043f\u0440\u0438\u043a\u0430\u0441\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441 \u043a\u0440\u0430\u0435\u043c, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f! \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0443\u0432\u044b, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u043e, \u043d\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u0447\u0435\u0442\u043d\u0430\u044f. \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u2014 \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e:<\/p>\n<pre><code class=\"pgsql\">with recursive d as(select * from elevation3d),b as(select min(x)a,max(x)b,min(y)c,max(y)d from d),j as(select 'w'||repeat(',',k)||',b,'||s||',b'||repeat(',',k)s,k from(select z,string_agg(l,',b,'order by y)s,length(max(l))::int+2 k from(select z,y,string_agg(case when exists(select 1 from d where x=x.x and y=y.y and h&gt;=h.z)then'0'else','end,''order by x)l from b,generate_series(0,10)h(z),generate_series(c,d)y(y),generate_series(a,b)x(x)group by h.z,y.y)g where z&gt;0 group by z)f),r as(select s,k from j union all select regexp_replace(s,'w(.{'||k||'})?,|,(.{'||k||'})?w','w\\1\\2w','g'),k from r)cycle s set n using m select coalesce(sum(length(s)-length(replace(s,',',''))),0) from r where n<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0443 \u043c\u0435\u043d\u044f \u0432\u0441\u0435, \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u0435-2026 \u0438 \u043d\u043e\u0432\u044b\u0435, \u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043b\u0438\u0446\u0430!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/925388\/\"> https:\/\/habr.com\/ru\/articles\/925388\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u043b\u0438\u043c\u043f\u0438\u0430\u0434\u044b \u043c\u044b, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0440\u0435\u0448\u0430\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 \u043d\u0430 SQL, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439, \u043d\u043e \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439. \u0427\u0435\u043c \u043a\u043e\u0440\u043e\u0447\u0435 \u2014 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412 \u0434\u0435\u0442\u0441\u0442\u0432\u0435 \u043c\u044b \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u0438\u043c \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445 \u0438 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0442\u043e \u0436\u0435 \u043d\u0430 SQL. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0432 \u044d\u0442\u043e\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0438 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0445\u0432\u0430\u0442\u0438\u0442, \u0430 \u0442\u0443\u0442 \u043c\u044b \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u0441\u044f.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u0442\u044c, \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u2014 \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u2014 \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u0421\u0440\u0430\u0437\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0438 \u0441 \u043e\u0434\u043d\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2014 \u043b\u0435\u0433\u043a\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u00ab\u043f\u043e-\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u00bb, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0432\u0435\u0442\u043d\u044b\u0435 \u0431\u0430\u043b\u043b\u044b. \u041d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443, \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u0443\u044e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0447\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0438, \u0447\u0435\u043c \u0422\u044c\u044e\u0440\u0438\u043d\u0433 \u043d\u0435 \u0448\u0443\u0442\u0438\u0442, \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u0438\u043a-\u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u041c\u044b \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0431\u043b\u0430\u0433\u0430\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0418\u0418. \u041d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u044e\u0442, \u043d\u043e, \u0447\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0436\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u0441\u0442\u0432\u0430. \u0412\u043e\u0442 \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c. \u0418 \u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u0418\u0418, \u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u041d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u044b\u0435, \u0438 \u0431\u0435\u0437 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u044b \u043d\u0430 \u043f\u043b\u0435\u0447\u0430\u0445 \u0438\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c (\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e. \u0415\u0441\u043b\u0438 \u0444\u0438\u043d\u0430\u043b\u0438\u0441\u0442\u044b \u043c\u0435\u043d\u044f \u0447\u0438\u0442\u0430\u044e\u0442, \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043b\u0438\u0446\u0430: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0438 \u0432\u044b \u0418\u0418, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u0432\u0430\u043c \u043f\u043e\u043c\u043e\u0433 \u0438\u043b\u0438, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u043b?<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a \u0437\u0430\u0434\u0430\u0447\u0430\u043c. \u0418\u0445 \u0431\u044b\u043b\u043e \u0442\u0440\u0438.<\/p>\n<h2>1. \u041a\u0432\u0430\u0439\u043d<\/h2>\n<h3>\u0423\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0432\u043f\u0430\u0441\u0442\u044c \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0444\u043e\u0440\u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0422\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439.<\/p>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0448\u043b\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u043c\u0438\u043d\u043a\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043b\u0435\u0433\u043a\u043e \u0433\u0443\u0433\u043b\u0438\u0442\u0441\u044f. \u041f\u0435\u0440\u0432\u0430\u044f \u0436\u0435 <a href=\"https:\/\/stackoverflow.com\/questions\/4006189\/quine-self-producing-sql-query\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 SO<\/a> \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0437 130 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">SELECT left(v,61)||chr(39)||v||chr(39)||right(v,3)FROM(SELECT'SELECT left(v,61)||chr(39)||v||chr(39)||right(v,3)FROM(SELECTv);'v);<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 (\u0442\u0438\u043f\u0430 \u041f\u0438\u0442\u043e\u043d\u0430), \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a \u0441\u0430\u043c\u0438\u0445 \u0432 \u0441\u0435\u0431\u044f. \u0412\u043e\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Quine_(computing)\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>:<\/p>\n<pre><code class=\"python\">b = 'b = %s%s%s; print(b %% (chr(39), b, chr(39)))'; print(b % (chr(39), b, chr(39)))<\/code><\/pre>\n<p>\u041d\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0432 \u041f\u043e\u0441\u0442\u0433\u0440\u0435\u0441\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>format<\/code>. \u0417\u0430\u043e\u0434\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u0438 \u043e\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0442\u043e\u0447\u043a\u0438 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 \u043a\u043e\u043d\u0446\u0435. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 102 \u0441\u0438\u043c\u0432\u043e\u043b\u0430:<\/p>\n<pre><code class=\"pgsql\">SELECT format(v,chr(39),v,chr(39))FROM(SELECT'SELECT format(v,chr(39),v,chr(39))FROM(SELECT%s%s%sv)'v)<\/code><\/pre>\n<p>\u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u041f\u043b\u0430\u0445\u043e\u0442\u043d\u0438\u043a\u043e\u0432 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u043a\u0430\u0432\u044b\u0447\u0435\u043a, \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>%L<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u0441\u0430\u043c. \u042d\u0442\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435, 70 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432:<\/p>\n<pre><code class=\"pgsql\">SELECT format(f,f)FROM(SELECT'SELECT format(f,f)FROM(SELECT%L f)f' f)f<\/code><\/pre>\n<p>\u041d\u043e \u0438 \u044d\u0442\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043e <code>FROM<\/code> \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u043e \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u0435\u0435 \u0436\u0435 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0418 \u0442\u0430\u043a\u0430\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0441\u0442\u044c \u2014 \u044d\u0442\u043e <code>trim<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <strong>64\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430:<\/strong><\/p>\n<pre><code class=\"pgsql\">SELECT format(f,f)FROM trim('SELECT format(f,f)FROM trim(%L)f')f<\/code><\/pre>\n<p>\u0414\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0441\u044f, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043a\u043e\u0440\u043e\u0447\u0435 \u2014 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>\u0410 \u043d\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0410\u0440\u0442\u0435\u043c \u0421\u0443\u0445\u043e\u0432, \u043e\u0431\u043e\u0439\u0434\u044f\u0441\u044c \u043e\u0434\u043d\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c <code>format<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0432\u0443\u0445 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0445\u0438\u0442\u0440\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 (68 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432):<\/p>\n<pre><code class=\"pgsql\">SELECT format('SELECT format(%1$L,%1$L)','SELECT format(%1$L,%1$L)')<\/code><\/pre>\n<p>\u0418\u0437 \u043a\u0443\u0440\u044c\u0435\u0437\u043d\u043e\u0433\u043e. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0441\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u043b\u0438, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>current_query<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u041c\u043e\u043b\u043e\u0434\u0446\u044b, \u044f \u043f\u0440\u043e \u043d\u0435\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0437\u0430\u0431\u044b\u043b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0442\u0432\u0435\u0440\u0433\u043b\u0430 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 <code>WITH<\/code>), \u0438 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u0434\u0443\u0445\u0443 \u043a\u0432\u0430\u0439\u043d\u043e\u0432. \u0427\u0435\u0441\u0442\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0442\u0435\u043a\u0441\u0442, \u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<h2>2. \u041b\u0443\u0436\u0438<\/h2>\n<h3>\u0423\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p>\u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>elevation<\/code> \u0437\u0430\u0434\u0430\u043d\u044b \u0432\u044b\u0441\u043e\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430: <\/p>\n<pre><code class=\"pgsql\">CREATE TABLE elevation(   x integer PRIMARY KEY,               -- \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 x   h integer CHECK (h BETWEEN 0 AND 10) -- \u0432\u044b\u0441\u043e\u0442\u0430 );<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u0430, \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u0441\u043e\u0442\u0430 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e. \u041e\u0431\u0449\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0442\u044b\u0441\u044f\u0447\u0438. <\/p>\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0434\u044b \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0436\u0434\u044f \u0432 \u043b\u0443\u0436\u0430\u0445?<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0438\u0306 \u043e\u0442\u0432\u0435\u0442 4: <\/p>\n<pre><code class=\"pgsql\">INSERT INTO elevation VALUES (-5,1), (-3,2), (-2,3), (-1,1), (1,2);<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0418\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f <a href=\"https:\/\/leetcode.com\/problems\/trapping-rain-water\/description\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0434\u0430\u0447\u0430 \u0441 \u043b\u0438\u0442\u043a\u043e\u0434\u0430<\/a>. \u041e\u0431 \u044d\u0442\u043e\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0435\u0449\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0437\u0432\u0435\u0437\u0434\u043d\u044b\u0439 \u0447\u0430\u0441 \u0418\u0418. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a, \u0441\u043a\u0430\u0436\u0435\u043c, DeepSeek \u043f\u0440\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u043b\u0443\u0436\u0430\u0445 \u0442\u0443\u0442 \u0436\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u0438 \u0441\u0430\u043c\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u041f\u0438\u0442\u043e\u043d\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <em>O<\/em>(<em>n<\/em>) \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 <em>O<\/em>(1) \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0412\u043e\u043f\u0440\u043e\u0441 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435. \u0418-\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u0438 \u0442\u0443\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442, \u043d\u043e \u0443\u0436\u0435 \u043d\u0430\u0447\u043d\u0435\u0442 \u043f\u043b\u0430\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u0443.<\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u044f\u0442 \u043d\u0430 \u043b\u0435\u0432\u043e\u0439 \u0438 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u0442\u044f\u0433\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c, \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e) \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f, \u0430 <code>array_agg<\/code> \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u0434\u0430\u0436\u0435 \u0437\u0432\u0443\u0447\u0438\u0442 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e; \u044f\u0441\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e (\u043d\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0438\u043d\u043a\u0438).<\/p>\n<p>\u0421\u0443\u0442\u044c \u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0432\u043e\u0434\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0435\u043d \u043f\u043e \u0431\u043e\u043a\u0430\u043c \u043e\u0442 \u043a\u043b\u0435\u0442\u043a\u0438 (\u043a\u0430\u043a \u0441\u043b\u0435\u0432\u0430, \u0442\u0430\u043a \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043d\u0435\u0435) \u043d\u0430\u0434 \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \u0432 \u0441\u0430\u043c\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435. \u0414\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0443\u0436\u043d\u044b \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438, \u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438\u0445 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb \u043f\u043e \u043c\u0435\u0440\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u041d\u043e \u0432\u0435\u0434\u044c \u0432 SQL \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043d\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u2014 \u0432\u043e\u0442 \u0438\u0445 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u044b\u0441\u043e\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u0435\u043d, \u0430 \u043d\u0430\u0448\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0445 \u043b\u0438\u043a\u0432\u0438\u0434\u0438\u0440\u0443\u0435\u043c.<\/p>\n<p>\u041d\u0430\u0434\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u044b\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 (\u043d\u0435\u043b\u044c\u0437\u044f \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c, \u0432\u0437\u044f\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440). \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"pgsql\">SELECT g.x, coalesce(e.h,0) FROM \u00a0\u00a0(SELECT min(x) minx, max(x) maxx FROM elevation), \u00a0\u00a0generate_series(minx,maxx) g(x) \u00a0\u00a0LEFT JOIN elevation e ON e.x = g.x;<\/code><\/pre>\n<pre><code> x  | coalesce ----+----------  -5 |    1  -4 |    0  -3 |    2  -2 |    3  -1 |    1   0 |    0   1 |    2 (7 rows)<\/code><\/pre>\n<p>\u041c\u043d\u043e\u0433\u043e\u0432\u0430\u0442\u043e \u0431\u0443\u0434\u0435\u0442. \u041d\u0430\u0434\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432 (\u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u044b\u0431\u0438\u0440\u0430\u044f \u043e\u0434\u043d\u043e\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043f\u043e\u043a\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0443\u043a\u0432), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442 \u043b\u0438\u0448\u043d\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"pgsql\">SELECT x, coalesce(h,0) FROM (   SELECT generate_series(min(x), max(x)) x FROM elevation ) LEFT JOIN elevation USING(x);<\/code><\/pre>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 PostgreSQL 16 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u043e <code>FROM<\/code> \u0441\u0442\u0430\u043b\u0438 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u2014 \u043c\u043d\u043e\u0433\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0443\u0447\u043b\u0438 \u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u0438\u043a\u0438. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435 \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u0437\u0430 \u0441\u0447\u0435\u0442 \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 (<code>x<\/code>) \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 <code>USING<\/code>.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442\u0438\u043a \u0437\u0430 \u0441\u0447\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0436\u0435 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0441\u043b\u043e\u0432\u0430 <code>NATURAL<\/code>:<\/p>\n<pre><code class=\"pgsql\">SELECT x, coalesce(h,0) h FROM (   SELECT generate_series(min(x), max(x)) x FROM elevation ) NATURAL LEFT JOIN elevation;<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0441\u044c \u043d\u0430 \u0432\u0441\u0435\u043c \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430. \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u043a\u043b\u0435\u0442\u043a\u0438 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u0430\u043c\u0443 \u043a\u043b\u0435\u0442\u043a\u0443) \u043d\u0430\u043c \u0434\u0430\u0441\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u043a\u043d\u0430 <code>OVER (ORDER BY x)<\/code>, \u0430 \u0441\u043f\u0440\u0430\u0432\u0430 \u2014 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u043a\u043d\u0430 <code>OVER (ORDER BY x DESC)<\/code>:<\/p>\n<pre><code class=\"pgsql\">WITH m AS (   SELECT x, coalesce(h,0) h FROM (     SELECT generate_series(min(x), max(x)) x FROM elevation   )   NATURAL LEFT JOIN elevation ), a AS (   SELECT h, max(h) OVER (ORDER BY x) l,   max(h) OVER (ORDER BY x DESC) r   FROM m ) SELECT * FROM a;<\/code><\/pre>\n<pre><code> h | l | r ---+---+---  1 | 1 | 3  0 | 1 | 3  2 | 2 | 3  3 | 3 | 3  1 | 3 | 2  0 | 3 | 2  2 | 3 | 2 (7 rows)<\/code><\/pre>\n<p>\u041f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0440\u0430\u0432\u0434\u0443 \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043b\u0435\u0432\u0430 \u0440\u0430\u0441\u0442\u0435\u0442, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043f\u0440\u0430\u0432\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f (\u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435! \u2014 \u043f\u043e\u0432\u0442\u043e\u0440\u044e \u0435\u0435).<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u043e\u0442\u044b (<code>least(p,q)-h<\/code>) \u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"pgsql\">WITH m AS (   SELECT x, coalesce(h,0) h FROM (     SELECT generate_series(min(x), max(x)) x FROM elevation   )   NATURAL LEFT JOIN elevation ), a AS (   SELECT h, max(h) OVER (ORDER BY x) l,   max(h) OVER (ORDER BY x DESC) r   FROM m ) SELECT coalesce(sum(least(l,r)-h),0) FROM a;<\/code><\/pre>\n<pre><code> coalesce ----------     4 (1 row)<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>coalesce<\/code>: \u043e\u043d \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c 0.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u0443\u044e \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0415\u0432\u0433\u0435\u043d\u0438\u0439 \u0416\u0430\u0431\u043a\u043e: \u0432\u043c\u0435\u0441\u0442\u043e <code>ORDER BY x DESC<\/code> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>ORDER BY-x<\/code>. \u041f\u044f\u0442\u044c \u0431\u0430\u0439\u0442 \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0435 \u043d\u0435 \u0432\u0430\u043b\u044f\u044e\u0442\u0441\u044f!<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 CTE \u0432 \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0442\u043e\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432 \u0441\u0442\u0438\u043b\u0435 \u0418\u0432\u0430\u043d\u0430 \u041c\u0430\u043a\u0441\u0438\u043c\u043e\u0432\u0430 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0435 202 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 (\u0441\u0430\u043c \u0418\u0432\u0430\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043b 208, \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u043e):<\/p>\n<pre><code class=\"pgsql\">SELECT COALESCE(SUM(LEAST(l,r)-d),0)FROM(SELECT h,COALESCE(h,0)d,MAX(h)OVER(ORDER BY x)l,MAX(h)OVER(ORDER BY-x)r FROM(SELECT generate_series(min(x),max(x))x FROM elevation)x NATURAL LEFT JOIN elevation)<\/code><\/pre>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u044d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u043e\u0432.<\/p>\n<p>* * *<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u0433\u0430\u0447\u0435. \u041a\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u043b \u043d\u0430\u0434 \u043d\u0435\u0439, \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0443, \u0447\u0442\u043e \u0441\u0430\u043c-\u0442\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u044b. \u042f \u0432\u043e\u0437\u044c\u043c\u0443 \u043b\u0438\u0441\u0442 \u0432 \u043a\u043b\u0435\u0442\u043a\u0443, \u0437\u0430\u043a\u0440\u0430\u0448\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u043a\u0438-\u0441\u0442\u0435\u043d\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u044e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c <em>\u043c\u0435\u0436\u0434\u0443<\/em> \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u043d\u0430 SQL? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u043d\u0430\u0448\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"pgsql\">WITH m AS (   SELECT x, coalesce(h,0) h FROM (     SELECT generate_series(min(x), max(x)) x FROM elevation   )   NATURAL LEFT JOIN elevation ), a AS (   SELECT d, string_agg(chr(65+(h&lt;d)::int),'' ORDER BY x) s   FROM m,<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-467537","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467537","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=467537"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467537\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}