Объединять данные с помощью SQL очень просто. Однако иногда очень нужны зависимые соединения, возвращающие лишь небольшое подмножество данных объединённой таблицы. С помощью
При объединении нескольких таблиц строки обеих таблиц связываются между собой на основе некоторых условий. Однако если результат должен быть ограничен, например, тремя последними купленными товарами для каждого покупателя, стандартное предложение соединение не будет работать: Объединённая таблица купленных товаров не может быть ограничена только тремя строками для каждого покупателя. Так не работает объединение, в него включаются все строки, соответствующие критериям объединения. Но при латеральном присоединении вместо таблицы будет присоединён подзапрос, который выполняется один раз для каждого покупателя, что приводит к эквивалентному циклу for-each в SQL.
https://www.dev-notes.ru/articles/database/for-each-loop-lateral-join/
LATERAL соединения знакомый для каждого цикл может быть воспроизведён в SQL.При объединении нескольких таблиц строки обеих таблиц связываются между собой на основе некоторых условий. Однако если результат должен быть ограничен, например, тремя последними купленными товарами для каждого покупателя, стандартное предложение соединение не будет работать: Объединённая таблица купленных товаров не может быть ограничена только тремя строками для каждого покупателя. Так не работает объединение, в него включаются все строки, соответствующие критериям объединения. Но при латеральном присоединении вместо таблицы будет присоединён подзапрос, который выполняется один раз для каждого покупателя, что приводит к эквивалентному циклу for-each в SQL.
https://www.dev-notes.ru/articles/database/for-each-loop-lateral-join/
Заметки разработчика
For each циклы с LATERAL соединениями
Обычно JOIN может связывать только два статических набора результатов, но при использовании JOIN LATERAL может быть использован эффективный цикл for-each...
Манипулируйте размеров сплитов для получения нужной площади области просмотра.
Устали от того, что размеры сплитов не совпадают с желаемыми? Предварительный просмотр сплитов или список быстрых исправлений не отображаются так, как хотелось бы? Раздражают слишком длинные строки на одном размере вертикального сплита? Нужно ещё несколько строк в окне :Git, чтобы было понятно, на что смотреть? В Vim меня это сильно раздражало. В течение многих лет я разочарованно мирился с этим.
https://www.dev-notes.ru/articles/vim/resize-splits/
Устали от того, что размеры сплитов не совпадают с желаемыми? Предварительный просмотр сплитов или список быстрых исправлений не отображаются так, как хотелось бы? Раздражают слишком длинные строки на одном размере вертикального сплита? Нужно ещё несколько строк в окне :Git, чтобы было понятно, на что смотреть? В Vim меня это сильно раздражало. В течение многих лет я разочарованно мирился с этим.
https://www.dev-notes.ru/articles/vim/resize-splits/
Заметки разработчика
Vim: Изменение размера сплитов
Манипулируйте размеров сплитов для получения нужной площади области просмотра.
Frontend-приложения играют центральную роль в обеспечении бесперебойной работы пользователей. В современной взаимосвязанной сети, где широко распространены сторонние интеграции и API, обеспечение надёжной безопасности имеет первостепенное значение. Нарушение безопасности может привести к краже данных, несанкционированному доступу и ухудшению репутации бренда. В этой статье мы расскажем вам, как использовать CORS и CSP для обеспечения безопасности ваших веб-страниц.
Представьте, что в ваше приложение внедрён вредоносный скрипт, который похищает конфиденциальные данные пользователей или перенаправляет их на мошеннические сайты. Страшно, правда? Но не стоит бояться! Правильная реализация CORS и CSP позволяет защитить наши frontend приложения и опередить потенциальные угрозы.
https://www.dev-notes.ru/articles/security/securing-front-end-apps-with-cors-and-csp/
Представьте, что в ваше приложение внедрён вредоносный скрипт, который похищает конфиденциальные данные пользователей или перенаправляет их на мошеннические сайты. Страшно, правда? Но не стоит бояться! Правильная реализация CORS и CSP позволяет защитить наши frontend приложения и опередить потенциальные угрозы.
https://www.dev-notes.ru/articles/security/securing-front-end-apps-with-cors-and-csp/
Заметки разработчика
Защита frontend приложений с помощью CORS и CSP
В современной взаимосвязанной сети, где широко распространены сторонние интеграции и API, обеспечение надёжной безопасности имеет первостепенное значение.
Менеджер зависимостей Composer является де-факто способом управления зависимостями в PHP-проектах. Вся современная PHP-разработка немыслима без Composer. Но знаете ли вы, что с помощью Composer можно делать многое, кроме установки и обновления зависимостей?
Именно так! В этой статье я перечислю такие возможности Composer, о которых вы, возможно, не знали. И которые могут помочь улучшить рабочий процесс в Composer.
https://www.dev-notes.ru/articles/php/lesser-known-composer-tricks-tips/
Именно так! В этой статье я перечислю такие возможности Composer, о которых вы, возможно, не знали. И которые могут помочь улучшить рабочий процесс в Composer.
https://www.dev-notes.ru/articles/php/lesser-known-composer-tricks-tips/
Заметки разработчика
Менее известные трюки и советы по Composer, которые нужно знать
Вся современная PHP-разработка немыслима без Composer. Но знаете ли вы, что с помощью Composer можно делать многое, кроме установки и обновления зависимостей?
В Laravel валидация форм является ключевым моментом для обеспечения безопасности и точности пользовательских данных. Компонент
https://www.dev-notes.ru/articles/laravel/form-requests-deep-dive/
FormRequest упрощает эту задачу, поскольку правила валидации хранятся в специальном классе, а не в контроллере. Это также делает код более аккуратным и позволяет использовать специальные функции, связанные с запросом, такие как получение модели или изменение типа данных в поле.https://www.dev-notes.ru/articles/laravel/form-requests-deep-dive/
Заметки разработчика
Laravel: Глубокое погружение в FormRequest
В Laravel валидация форм является ключевым моментом для обеспечения безопасности и точности пользовательских данных. Компонент FormRequest упрощает эту задачу.
Я написал A Modern CSS Reset почти 4 года назад, и, да, он не слишком хорошо сохранился. Несколько дней назад я заметил, что на него снова ссылаются, и подумал, что, вероятно, это хорошая идея — опубликовать обновлённую версию.
Я знаю, что у меня ужасный послужной список в области сопровождения open source. Поэтому я решил заархивировать оригинал и просто опубликовать это вместо него. Делайте с ним что хотите!
Чтобы быть предельно ясным, это сброс CSS, который работает для меня и для нас в Set Studio. Всякий раз, когда я говорю "мы", я имею в виду именно нас.
https://www.dev-notes.ru/articles/css/a-more-modern-css-reset/
Я знаю, что у меня ужасный послужной список в области сопровождения open source. Поэтому я решил заархивировать оригинал и просто опубликовать это вместо него. Делайте с ним что хотите!
Чтобы быть предельно ясным, это сброс CSS, который работает для меня и для нас в Set Studio. Всякий раз, когда я говорю "мы", я имею в виду именно нас.
https://www.dev-notes.ru/articles/css/a-more-modern-css-reset/
Заметки разработчика
Более современный сброс CSS
Я написал A Modern CSS Reset почти 4 года назад, и, да, он не слишком хорошо сохранился. Несколько дней назад я подумал опубликовать обновлённую версию.
В этой статье мы рассмотрим, что означает
Такая установка обусловлена слабо типизированной природой PHP и растущим спросом на строго типизированные возможности, который предъявляют другие популярные языки, такие как Java.
Обе стратегии типизации (слабая и строгая) имеют свои плюсы и минусы, прежде всего, давайте разберёмся в их значении.
https://www.dev-notes.ru/articles/php/why-use-declarestrict-types-1-in-php/
declare(strict_types=1), когда PHP разработчикам стоит его использовать, а когда нет, а также приведём примеры, иллюстрирующие его важность.Такая установка обусловлена слабо типизированной природой PHP и растущим спросом на строго типизированные возможности, который предъявляют другие популярные языки, такие как Java.
Обе стратегии типизации (слабая и строгая) имеют свои плюсы и минусы, прежде всего, давайте разберёмся в их значении.
https://www.dev-notes.ru/articles/php/why-use-declarestrict-types-1-in-php/
Заметки разработчика
Зачем использовать declare(strict_types=1) в PHP
Включите режим строгой типизации в PHP с помощью declare(strict_types=1). Разберём его последствия на примерах кода.
Локальные среды Laravel под Windows, такие, как Vagrant/Homestead, Laravel Sail или Laragon, могут быть очень медленными или ресурсоёмкими. Давайте создадим более нативную установку, которая работает очень хорошо! Нам удалось сократить время выполнения сложных операций с 13 с. до 1,5 с., что составляет прирост около 800%!
https://www.dev-notes.ru/articles/devops/how-to-setup-a-real-fast-local-laravel-development-environment-for-windows/
https://www.dev-notes.ru/articles/devops/how-to-setup-a-real-fast-local-laravel-development-environment-for-windows/
Заметки разработчика
Как настроить среду разработки Laravel для Windows без Docker
Локальные среды Laravel под Windows, такие, как Vagrant/Homestead, Laravel Sail или Laragon, могут быть очень медленными или ресурсоёмкими.
PHP итераторы являются важнейшими инструментами для эффективного обхода и манипулирования структурами данных, такими как массивы, объекты и т.д. Они обеспечивают чистый и эффективный способ работы с большими массивами данных без одновременной загрузки всего массива в память. В этой статье мы рассмотрим PHP итераторы и их использование для обхода различных структур данных.
https://www.dev-notes.ru/articles/php/php-iterators-for-walking-through-data-structures/
https://www.dev-notes.ru/articles/php/php-iterators-for-walking-through-data-structures/
Заметки разработчика
PHP итераторы для перебора структур данных
Обход, фильтрация и манипулирование данными с помощью итераторов в PHP. Как создавать пользовательские итераторы и фильтры.
Forwarded from Сергей Предводителев
🍒 Авторские телеграм-каналы о разработке и IT в целом
Сейчас время, когда на нас льётся огромный поток информации. Компаний борются за внимание людей. А тут ещё так удачно появились генеративные ИИ. И как итог — куча некачественного бездушного контента.
Остаётся только искать живые авторские каналы, где люди пока ещё пишут что-то от себя и делятся своим опытом.
На днях проводил розыгрыш билета на конференцию, где нужно было рассказать об авторских телеграм-каналах. Прислали много каналов, отобрал айтишные. О многих ранее не слышал.
• Диджитализируй! — Алексей Голобурдин
• PHP Fart Time — Алексей Гагарин и Павел Бучнев
• Галера Морева — Антон Морев
• ПЫХ и PHP умирает?! — Валентин Удальцов
• Пятиминутка PHP — Пётр Мязин
• adelf on programming — Адель Файзрахманов
• ebanoePHP — Артур Пантелеев
• SOER — Евгений Сергеев
• igancev.ru и phpinfo(); — Иван Ганцев
• ArturKryukov video — Артур Крюков
• emacsway-log — Иван Закревский
• Evgeniy Kuvshinov — Евгений Кувшинов
• ElisDN.ru — Дмитрий Елисеев
• samdark blog — Александр Макаров
• dependency hell — Антон Кучеров
• Tolstoy Live — Егор Толстой
• johenews — Дмитрий Ковалёв
• Вастрик.Пынь — Василий Зубарев
• Beer::PHP — Кирилл Сулимовский
• agoalofalife — Илья Чубаров
• Alek OS — Александр Осадин
• Заметки разработчика — Алексей Лоскутов
• Сашок Горшок (DEV & MGMT) — Александр Яковлев
Мой канал тоже упомянули — Сергей Предводителев, такая вот рекурсия 😀
❤ Репост приветствуется.
Сейчас время, когда на нас льётся огромный поток информации. Компаний борются за внимание людей. А тут ещё так удачно появились генеративные ИИ. И как итог — куча некачественного бездушного контента.
Остаётся только искать живые авторские каналы, где люди пока ещё пишут что-то от себя и делятся своим опытом.
На днях проводил розыгрыш билета на конференцию, где нужно было рассказать об авторских телеграм-каналах. Прислали много каналов, отобрал айтишные. О многих ранее не слышал.
• Диджитализируй! — Алексей Голобурдин
• PHP Fart Time — Алексей Гагарин и Павел Бучнев
• Галера Морева — Антон Морев
• ПЫХ и PHP умирает?! — Валентин Удальцов
• Пятиминутка PHP — Пётр Мязин
• adelf on programming — Адель Файзрахманов
• ebanoePHP — Артур Пантелеев
• SOER — Евгений Сергеев
• igancev.ru и phpinfo(); — Иван Ганцев
• ArturKryukov video — Артур Крюков
• emacsway-log — Иван Закревский
• Evgeniy Kuvshinov — Евгений Кувшинов
• ElisDN.ru — Дмитрий Елисеев
• samdark blog — Александр Макаров
• dependency hell — Антон Кучеров
• Tolstoy Live — Егор Толстой
• johenews — Дмитрий Ковалёв
• Вастрик.Пынь — Василий Зубарев
• Beer::PHP — Кирилл Сулимовский
• agoalofalife — Илья Чубаров
• Alek OS — Александр Осадин
• Заметки разработчика — Алексей Лоскутов
• Сашок Горшок (DEV & MGMT) — Александр Яковлев
Мой канал тоже упомянули — Сергей Предводителев, такая вот рекурсия 😀
Please open Telegram to view this post
VIEW IN TELEGRAM
Стандартной процедурой для схем баз данных является использование инкрементного первичного ключа для идентификации записей. Однако этот идентификатор также используется непосредственно в URL-адресах приложений. Злоумышленник может вручную увеличить идентификатор, чтобы найти все существующие записи. Этот вектор атаки часто упускается из виду при разработке приложений, однако его можно легко модифицировать в существующих приложениях. Необходимо расширить каждую таблицу случайным столбцом UUID v4, заменив им числовой идентификатор в URL.
https://www.dev-notes.ru/articles/database/uuid-prevent-enumeration-attack/
https://www.dev-notes.ru/articles/database/uuid-prevent-enumeration-attack/
Заметки разработчика
Использование UUID для предотвращения атак методом перебора
Простой UUID-столбец не позволяет парсерам перебрать все доступные записи.
Недавно мне пришлось решать задачи, требующие знания "сырых" функций PHP, таких, как итерация файлов и каталогов. По мере развития все более высоких уровней абстракции мы часто забываем, как работать на низком уровне. В реальности это имеет множество последствий, особенно с точки зрения производительности.
По мере проведения этих оптимизаций я замечаю, что моё приложение поддерживает растущие нагрузки, несмотря на снижение потребления аппаратных ресурсов. Надеюсь, что приведённые ниже фрагменты помогут не только молодым разработчикам, но и опытным профессионалам, которые ищут идеи по оптимизации производительности.
https://www.dev-notes.ru/articles/php/iterate-files-and-directories/
По мере проведения этих оптимизаций я замечаю, что моё приложение поддерживает растущие нагрузки, несмотря на снижение потребления аппаратных ресурсов. Надеюсь, что приведённые ниже фрагменты помогут не только молодым разработчикам, но и опытным профессионалам, которые ищут идеи по оптимизации производительности.
https://www.dev-notes.ru/articles/php/iterate-files-and-directories/
Заметки разработчика
Итерация файлов и каталогов в PHP
Несколько вариантов итерации/перебора файлов и каталогов в PHP: glob, RecursiveDirectoryIterator, scandir и PHP-генераторы.
👍4
Массивы — удобный способ организации и передачи данных в PHP-приложениях, но стоит ли это делать? В этой статье я расскажу о минусах злоупотребления использованием ассоциативных массивов и покажу простую альтернативу этому.
https://www.dev-notes.ru/articles/php/avoid-the-aop-array-oriented-programming/
https://www.dev-notes.ru/articles/php/avoid-the-aop-array-oriented-programming/
Заметки разработчика
Избегайте AOP: Array-Oriented Programming
В этой статье я расскажу о минусах злоупотребления использованием ассоциативных массивов и покажу простую альтернативу этому.
👍4
В последнее время в сообществе PHP разработчиков ведутся дебаты о преимуществах и недостатках Композиции и Наследования. В мире объектно-ориентированного программирования (ООП) существует множество мощных инструментов и концепций, каждая из которых имеет свои сильные и слабые стороны и призвана улучшить читаемость, модульность и возможность повторного использования кода.
https://www.dev-notes.ru/articles/php/composition-over-inheritance-in-php/
https://www.dev-notes.ru/articles/php/composition-over-inheritance-in-php/
Заметки разработчика
Композиция вместо Наследования в PHP
В последнее время в сообществе PHP разработчиков ведутся дебаты о преимуществах и недостатках Композиции и Наследования.
Для значений
MySQL и PostgreSQL совершенно по-разному сортируют
https://www.dev-notes.ru/articles/database/order-by-with-null/
NULL в nullable столбцах применяется определённый порядок. Поведение базы данных может быть унифицировано или изменено в соответствии с намерениями приложения путём корректировки размещения значений NULL.MySQL и PostgreSQL совершенно по-разному сортируют
NULL-значения в nullable столбцах. В MySQL они будут располагаться перед всем, а в PostgreSQL — последними. Однако по замыслу приложения или UX может потребоваться другой порядок сортировки. В таких случаях порядок сортировки NULL-значений можно легко изменить.https://www.dev-notes.ru/articles/database/order-by-with-null/
Заметки разработчика
Размещение NULL значений для ORDER BY с nullable столбцами
Установите определённый порядок для NULL значений в nullable столбце при использовании ORDER BY.
👍3
Тип
https://www.dev-notes.ru/articles/typescript/type-never/
never в TypeScript очень мало обсуждается, поскольку он не так распространён и не так неизбежен, как другие типы. Начинающий пользователь TypeScript, вероятно, может игнорировать тип never, поскольку он появляется только при работе с расширенными типами, такими как условные типы, или при чтении загадочных сообщений об ошибках типов.https://www.dev-notes.ru/articles/typescript/type-never/
Заметки разработчика
Полное руководство по типу Never в TypeScript
Тип never в TypeScript очень мало обсуждается, поскольку он не так распространён и не так неизбежен, как другие типы.
Value Objects/Объекты Значения — это фантастическая концепция, которую мы можем использовать для улучшения наших приложений. Они представляют собой небольшие объекты, такие как Money, DateRange, Email или Age, которые мы используем в сложных приложениях. Они являются ключевыми элементами при создании эффективного, понятного и сопровождаемого кода.
Объекты Значения характеризуются неизменяемостью и оцениваются по состоянию, а не по идентичности. В отличие от Entity Objects/Объектов Сущности, которые обладают определённой идентичностью, Объекты Значения не обладают каким-либо уникальным идентификатором. Вместо этого они полностью определяются своим значением, т.е. считается, что два Объекта Значений равны, если их значения совпадают, независимо от того, являются ли они отдельными экземплярами.
Например, возьмём два экземпляра Объекта Значения Money, один из которых создан для представления 10$, а другой отдельно инициирован также для представления 10$. Хотя это два разных экземпляра, в рамках приложения мы считаем их равными, поскольку они представляют одно и то же значение.
Объекты Значения делают ваш код более явным, читаемым и менее подверженным ошибкам. Они инкапсулируют связанные данные в логические и осмысленные концепции и контекст, что облегчает управление, тестирование и отладку. Понимание и правильная реализация Объектов Значений могут значительно упростить сложную бизнес-логику и повысить качество кодовой базы.
https://www.dev-notes.ru/articles/php/understanding-value-objects-in-php/
Объекты Значения характеризуются неизменяемостью и оцениваются по состоянию, а не по идентичности. В отличие от Entity Objects/Объектов Сущности, которые обладают определённой идентичностью, Объекты Значения не обладают каким-либо уникальным идентификатором. Вместо этого они полностью определяются своим значением, т.е. считается, что два Объекта Значений равны, если их значения совпадают, независимо от того, являются ли они отдельными экземплярами.
Например, возьмём два экземпляра Объекта Значения Money, один из которых создан для представления 10$, а другой отдельно инициирован также для представления 10$. Хотя это два разных экземпляра, в рамках приложения мы считаем их равными, поскольку они представляют одно и то же значение.
Объекты Значения делают ваш код более явным, читаемым и менее подверженным ошибкам. Они инкапсулируют связанные данные в логические и осмысленные концепции и контекст, что облегчает управление, тестирование и отладку. Понимание и правильная реализация Объектов Значений могут значительно упростить сложную бизнес-логику и повысить качество кодовой базы.
https://www.dev-notes.ru/articles/php/understanding-value-objects-in-php/
Заметки разработчика
Понимание Value Objects/Объектов Значения в PHP
Value Objects/Объекты Значения — это фантастическая концепция, которую мы можем использовать для улучшения наших приложений.
👍6
TypeScript, мощная надстройка над JavaScript, завоевал популярность среди разработчиков благодаря сложной системе типизации. Он предлагает два способа определения форм данных: типы и интерфейсы. Но как сделать выбор между ними? Знание тонких различий и вариантов использования очень важно для эффективной разработки. В статье мы рассмотрим типы и интерфейсы, изучим их ключевые различия и практические случаи использования, чтобы вы могли принять взвешенное решение о том, когда использовать каждый из них.
https://www.dev-notes.ru/articles/typescript/type-vs-interface/
https://www.dev-notes.ru/articles/typescript/type-vs-interface/
Заметки разработчика
TypeScript: Сравнение Типа и Интерфейса
Мы подробно рассмотрим типы и интерфейсы, изучим ключевые различия между ними и практические случаи использования, чтобы знать, когда применять каждый из них.
Узнайте, как использовать @scope для выбора элементов только в ограниченном поддереве DOM.
https://www.dev-notes.ru/articles/css/at-scope/
https://www.dev-notes.ru/articles/css/at-scope/
Заметки разработчика
Ограничение области действия селекторов с помощью CSS правила @scope
Узнайте, как использовать @scope для выбора элементов только в ограниченном поддереве DOM.
👍1
Forwarded from PHP Fart Time (Алексей roxblnfk)
#Article #php
Всем нравятся Constructor Property Promotion, не так ли?
Теперь попробуем создать объекты из обоих вариантов через рефлексию без использования конструктора.
https://3v4l.org/0tLcM
Такой способ создания объектов в обход конструктора широко используется под капотом многих библиотек, не только тех, которые используют
И иногда это стоит учитывать при работе с классами, которые будут проходить через гидрацию или демаршализацию. У меня такое уже выстреливало 😳.
А если ты счастливый пользователь Cycle ORM, то я рекомендую вообще закрывать конструкторы сущностей (делать пустой приватный конструктор) и вместо этого писать фабрики.
Всем нравятся Constructor Property Promotion, не так ли?
final class Foo {
public function __construct(
public bool $bar = false,
public array $baz = [],
) { }
}
☝️ эти фрагменты кода эквивалентны 👇final class Foo {
public bool $bar;
public array $baz;
public function __construct(
bool $bar = false,
array $baz = [],
) {
$this->bar = $bar;
$this->baz = $baz;
}
}
Но не эквивалентны этому:final class Foo {
public bool $bar = false;
public array $baz = [];
public function __construct(
bool $bar = false,
array $baz = [],
) {
$this->bar = $bar;
$this->baz = $baz;
}
}
Разница в наличии значений по умолчанию у свойств.Теперь попробуем создать объекты из обоих вариантов через рефлексию без использования конструктора.
https://3v4l.org/0tLcM
object(Foo)#3 (0) { ["bar"]=> uninitialized(bool) ["baz"]=> uninitialized(array) }
object(Foo)#3 (2) { ["bar"]=> bool(false) ["baz"]=> array(0) { } }
Если у свойства нет значения по умолчанию, то оно будет неинициализированным.Такой способ создания объектов в обход конструктора широко используется под капотом многих библиотек, не только тех, которые используют
doctrine/instantiator.И иногда это стоит учитывать при работе с классами, которые будут проходить через гидрацию или демаршализацию. У меня такое уже выстреливало 😳.
А если ты счастливый пользователь Cycle ORM, то я рекомендую вообще закрывать конструкторы сущностей (делать пустой приватный конструктор) и вместо этого писать фабрики.
👍1
Статистические расчёты на временном интервале должны учитывать недостающие данные. Вместо того чтобы заполнять недостающие записи в приложении, можно изменить запрос, чтобы делать это напрямую.
Результаты некоторых статистических расчётов будут иметь пропуски, поскольку информация за конкретные дни не сохранялась. Но вместо того, чтобы заполнять эти пустоты кодом приложения, можно перестроить запрос к базе данных: В качестве источника для присоединения к статистическим данным создаётся последовательность значений без пропусков. Для PostgreSQL для создания последовательности можно использовать функцию
https://www.dev-notes.ru/articles/database/statistical-results-fill-gaps/
Результаты некоторых статистических расчётов будут иметь пропуски, поскольку информация за конкретные дни не сохранялась. Но вместо того, чтобы заполнять эти пустоты кодом приложения, можно перестроить запрос к базе данных: В качестве источника для присоединения к статистическим данным создаётся последовательность значений без пропусков. Для PostgreSQL для создания последовательности можно использовать функцию
generate_series, в то время как для MySQL это необходимо делать вручную с помощью рекурсивного общего табличного выражения (CTE).https://www.dev-notes.ru/articles/database/statistical-results-fill-gaps/
Заметки разработчика
Заполнение пропусков в результатах статистических временных рядов
Статистические расчёты на временном интервале могут иметь пробелы из-за отсутствия данных, которые легко заполняются.
🔥3