Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Что быстрее массив или объект?

Лучший ответ:
Мне это напомнило историю, когда некий докладчик сравнил поиск в Яндексе и прямое указание сайта в адресной строке. Типа, когда он пишет адрес сайта, то сразу переходит на него, и якобы поиск не включается. Однако даже при прямом указании адреса сайта всё равно включается поиск: вы ввели адрес сайта, но это не точный путь к серверу, где хранятся данные. Пока идёт запрос к данным, и пока они идут обратно, включаются несколько поисков на разных этапах.

Так же и здесь. По сути системе нужно достать некое значение из памяти. Массивы изначально заточены под машинную организацию памяти: по порядку. Логично предположить, что если вам нужно N-e значение, то оно быстрее достанется из памяти, так как оно N-e в самой памяти, начиная от некой ячейки (грубо говоря). Более сложные ассоциативные массивы (или объекты) организованы в памяти более сложно (извиняюсь за тавтологию). Ассоциативный массив - это, как минимум, два обычных массива. Соответственно, выполняя поиск по нему, работают уже минимум два поиска.

это всегда перебор всего массива каждый раз. 
Если ключи уникальны, а в обычных javascript массивах это так, то вряд ли поиск продолжается после нахождения нужного элемента.

В целом веб-приложения это не совсем та сфера, где надо оптимизировать запросы, на базе архитектуры, я имею в виду, когда получаешь выигрыш в пару миллисекунд. Страница грузится пару секунд, анимации длятся 0.3с и так далее - на этом фоне выигрыш будет нулевой, даже с 1 миллиардом пользователей онлайн )

По существу вопроса, мне кажется, вы всё делаете совершенно правильно, потому что в вебе самое главное - это удобство постоянного развития проекта. Если код внешне, и по логике похож на то, как данные организованы в бытовом восприятии, это удобно: быстро вникаешь и можно дорабатывать.

Худший ответ:
Почему вы считаете, что обращение по ключу - не поиск?

Ключ это прямой адрес в памяти?
Нет, а значит наверное надо выполнить поиск по всем объектам, чтобы найти нужный по ключу?
Нужно смотреть реализацию геттера, чтобы понять насколько там все сложно.
Вопрос: Как лучше обращаться с параметрами метода?

Лучший ответ:
Аргументировать довольно просто и даже сослаться на конкретные абзацы из книги Implementing domain-driven design, а именно, то что автор пишет про сервисы. Автор книги довольно четко рассказывает почему сервисы не должны обладать состоянием.

У вас классический сервис и у вас проблема, только лишь потому, что вы впринципе неправильно подошли к проектированию вашего сервиса.

В первую очередь вам нужно спроектировать интерфейс CalculatorInterface

interface CalculatorInterface {
  public function calculate($products, $city);
}

Далее вам нужно создать две реализации этого интерфейса CdekCalculator и EmsCalculator

class CdekCalculator implements CalculatorInterface {
  public function calculate($products, $city) {
     // реализация расчета через cdek
  }
}

class EmsCalculator implements CalculatorInterface {
  public function calculate($products, $city) {
    // реализация расчета через ems
  }
}

И теперь ваш класс доставки будет выглядеть таким образом

class Delivery {
  private $calculator;

  public function __construct(CalculatorInterface $calculator) {
     $this->calculator = $calculator;
  }
  public function calculate($products, $city) {
    //тут ещё какая-то логика, которая определяет условия доставки, если она вообще возможна
    return $this->calculator->calculate($products, $city);
  }
}

Предмета спора больше нет. Вы просто передаете в класс Delivery нужную реализацию калькулятора. Код выше это псевдоязык, не php и вообще только базовая идея того, как это должно быть. У вас наверняка тут же возникнет вопрос, как вам тогда выводить все расчеты доставки в ваш UI. Но извините не могу написать за вас всё приложение.

Это базовые вещи в объектно-ориентированном программировании. Называется полиморфизм подтипов. Без этих знаний невозможно писать хороший объектно-ориентированный  код. Лучше оба придите к выводу, что вам срочно нужно почитать какие-нибудь книги об объектно-ориентированном программировании и начать с самых основ, что такое полиморфизм и в частности полиморфизм подтипов.

Вообще protected/private методы и ветвления из условных конструкций - это практически всегда показатель спагетти-кода и первый звоночек, что вы пишете процедурный код используя ООП синтаксис. Вы придете к этому выводу если будете разрабатывать через TDD, а затем сможете нагуглить ваши предположения у других программистов.

Худший ответ:
Дядя Боб говорил "The best functions are those with no parameters!". Так что свойства.
Вопрос: FreeRTOS: какие правила хорошего тона?

Лучший ответ:
Прежде всего смотрите на RTOS (любую) как на инструмент решения Вашей задачи. У любого инструмента есть описание: Курниц (вполне себе актуален и сейчас) и офф мануал в pdf (по-моему бесплатно дают).
Правильно пользоваться ОС это значит понимать:
1) разницу в примитивах синхронизации (очередь, мьютекс, семафор) когда и где ими пользоваться
2) как задавать размер стека и приоритет задачам
3) что делать в прерываниях и что делать в задачах (в том числе как правильно задавать приоритеты прерываний)
Это первое что пришло на ум.

Мне лично, после перехода на ОС, пришлось немного перестраивать мышление при написании кода: 
1) ты никогда не знаешь когда выполнится код в одной задаче по сравнению с соседней задачей.
2) выполнение задачи могут прервать другие задачи и прерывания
3) если задача куда-то пишет, а другая читает - значит их нужно синхронизировать
и т.д.
Удачи!

Худший ответ:
Почитай тут
Там и ссылки на статьи и рекомендации.
Вопрос: Какая максимальная мощность может передаваться на 32-разрядный PCI слот?

Лучший ответ:
Это два разных вопроса.
Карта расширитель USB скорей всего не даст тебе больше 500 мА на порт, суммарно 2.5 ампера, это зависит от конкретной карты, как сделана разводка питания портов.
А вот через сам разъём можно и больше, там 8 контактов на 5 вольт, так что 4 ампера пожалуй можно из него вытянуть.

Худший ответ:
Вообще в теории PCI-E (x16) может потянуть до 375( если 8Pin+6Pin+6Pin конектор подключен ) при 12V, а теперь простая математика

A2=375/12=31.25(А)

А USB 2.0 может "отдавать" 5А при 12V
Если всё суммировать то получится лёгкий и бесполезный ответ: максимально :)
Но если взять USB 3.0 то у него будет 3А при 12V

Источник : Wiki
Вопрос: Как найти хостинг домена на RU-CENTER, чтобы получить доступ к администрированию сайта?

Лучший ответ:
название сайта в панели НЕ ВСЕГДА РАВНО имени домена!
смотрите синонимы
а админов можно редактировать в базе данных

Худший ответ:
Домен и хостинг - это разные вещи, хотя руцентр барыжит и тем и другим. Доступ к панели управления доменами означает, что Вы можете изменить адрес, где будет располагаться сайт rassada.ru на любой, какой захотите. Это ценное право, без него домен бесполезен. 
Как найти хостинг, где находится сайт? По IP, который прописан для домена rassada.ru. Если у руцентра брали еще DNS-Primary - у него же есть услуга управления зонами (DNS-хостинг) в панели клиента. Если брали Secondary - то же самое, только там будет прописано, кто Primary - это полезно. А по IP, где лежит сайт (а его можно определить банальным пингом) узнается, кто хостер.
Ну и разумеется, есть саппорт руцентра и саппорт хостера (а это вовсе не обязательно будет одно и то же)
Вопрос: Сколько оперативки надо для комфортной работы бухгалтера?

Лучший ответ:
у мня ноут (2012 года выпуска)
так я на нем разработку на 1С веду, ну в принципе хватает.
Так что буху заглаза хватит.

Худший ответ:
Если есть возможность - ставьте 16. Бухгалтеру же всё одновременно потребуется - и 1С, и браузер не с одной вкладкой (контуры, консолидации, одноклассники :) ), и офис, и прочее... По-моему, сейчас для офисного компьютера 8 гигов - это минимум, если уж не совсем пишмашинка нужна.
Процессор любой.
Если вдруг база у неё же на компе жить будет, то ssd очень на пользу будет.
Вопрос: Как настроить общую папку в VirtualBox между Windows 10 и Ubuntu 18.04?

Лучший ответ:
нафех самбу и нфс :) лишние сетевые обертки.
установи в гостевой убунте пакет virtualbox-guest-dkms он сам все подтянет и скомпилирует все драйвера для гостевой системы, в том числе и драйвер общих папок vboxsf.

Худший ответ:
Лучше самбу или nfs на убунте поднимите и сетевым диском подключите.
Вопрос: Различия между Системным программированием, и программирование микроконтроллеров?

Лучший ответ:
Направления разные, но не слишком далекое.
Системное программирование обычно относится к разработке операционной системы и всего вокруг нее.
В микроконтроллерах тоже могут быть свои "операционные системы" - прошивки.

Но обе области слишком велики, чтобы быть одним целым. Торвальдс вон всю жизнь считай кусочек одной операционки разрабатывает.

Худший ответ:
Системное програграмирование это раработка драйверов.
Програмирование микроконтроллеров это "Умные и не очень чайники" итд.
Это все примерно и не очень точно..
Вопрос: Вывод денежных средств с App Store и Google Play за бугор?

Лучший ответ:
Используйте Payoneer, выплаты под 1% от суммы. Если получили выплат суммарно больше 10к$, через саппорт комиссия отменяется. 
Выпускают свои карты.

Худший ответ:
1. С чего вдруг такая идея что ни один российский банк не выплатил деньги? оформляйтесь как ИП\ООО или как самозанятый и у банка не будет вопросов. И десятки миллионов свободно выводятся на личные счета, нет проблем, если все прозрачно и налоги уплачены. 
2. Зарубежные банки обычно не открывают рублевые счета. Наиболее лояльные к россиянам банки находятся в Прибалтике, открыть счет не резеденту довольно сложно. 
Если это попытка уйти от налогов - то она крайне неудачная. На суммах в несколько миллионов рублей дешевле и проще платить налоги.
Вопрос: Есть ли хороший актуальный на 2019 год ресурс по react/redux?

Лучший ответ:
Redux ExamplesRedux-course-v2react-redux-linksHow to choose between Redux's store and React's state?Курсы от Dan Abramov

Худший ответ:
А какие сертификаты или тесты можно сдать онлайн чтоб в резюме вывесить ссылку?
Вопрос: Как и где хранить общие файлы?

Лучший ответ:
По моему git submodule самое то оно.
Создаёте 3 реп. туда общие файлы. И в каждый реп добавляете субмодуль. По мере обновления синхронизируете субмодули!

Чем хорошо субмодуль? Тем что, вы можете "взять" слепок основного репа и субмодуля. При этом вести активную работу на всех трех. Ну и естественно использовать ветвление: всё что уходит в деплой берёте строго с веток релиз (например). + правильно здесь использовать теги. Особенно у субмодуля. Т.е. забирать с субмодуля не по камиту, а по тегу.
Удачи!

Худший ответ:
1. а что за общие файлы?
2. сделать для общих файлов третий репозиторий и коммитить туда
3. гит сабмодули наверное не самое лучшее решение. Но надо понять что за файлы.
Вопрос: Где можно отучиться на DevOps'а?

Лучший ответ:
Сначала надо дорасти до бородатого сисадмина (цикл статей для начинающих, Яндекс выпилил вроде у себя записи лекций с КИТа, поэтому добро пожаловать на торренты), параллельно изучая цикл разработки ПО с инструментарием на всех шагах, тоже естественно на практике (тут помогут как open source проекты, так и зарабатываемые деньги, которые сгорят на лабы в облаках дабы покрутить игрушки), а в идеале ещё и поработать весломразработчиком от года и более.

Худший ответ:
DevOps это не отдельная вакансия. Это инфраструктурный инженер, который работает над задачами автоматизации сборки, настройки различных окружений и деплоймента.
То есть это еще одно направление системных администраторов, со своим набором технологий.

В проект отдельный ДевОпс нужен тогда, когда с этой задачей не справляются разработчики, поскольку либо инфраструктура становится сложной, либо работы слишком много, чтобы ее кто-то делал "по-совместительству".

Оба варианта не подходят для того, чтобы эту работу выполнял джуниор, так как в первом случае нужен опыт и хорошее знание различных технологий, во втором - опыт и ответственность за различные организационные моменты, которые тоже джуну не под силу.

Следовательно, джуниор-девопс звучит странно.

А значит - нужно начинать с админа, набираться опыта, потом уже подучить ci/cd инструменты и уже потом смотреть в девопс.
Также в девопс можно прийти из разработчиков или тестировщиков (если занимался автоматизацией и настройкой тестовых окружений).
Но в любом случае стадию джуниор нужно пройти до того, как начинаешь думать про ДевОпса.
Вопрос: Почему не работает crontab?

Лучший ответ:
Пишите везде полные пути: до питона, до файла

Худший ответ:
Кронтабы бывают разные. Что вы редактитруете и как? Через crontab -e или /etc/crontab? В /etc/crontab надо пользователя указывать, через crontab -e - нет. Переменных путей лучше избегать.
Вопрос: Какой язык программирования и технологии выбрать для написания программы советника?

Лучший ответ:
Фронтенд составляющая проекта:
1-3 требования вам выполнит сверстанная на коленке html-форма с элементами логики на JavaScript, даже без vue.
5 требование - в общем, это любой браузер.
Бэкенд составляющая проекта:
4 требование - можно использовать нетребовательные к квалификации разработчика MySQL базу данных и PHP сервер для реализации простейшей логики обращения к этой базе.

Худший ответ:
Как  вариант Net5 (net core 3.1)  

1. В 8 полей вводиться цифровые значения (либо  форма, либо Vue, либо react либо angular)

2. Каждому полю присваивается определенное значение которые заранее будут заданы в переменных (около 40 разных) (Vue, либо react либо angular) c запросом  данных с сервера

3. В зависимости от комбинации 8 значений будет выводиться определенный результат на экран ( заранее будет задано около 60 возможных результатов) если нужного результата не будет задано, будет выводиться ошибка.
(Vue, либо react либо angular) c запросом  данных с сервера

4. Необходимо организовать хранения всех данных в БД.
Смотрите в сторону EFcore , Duper  чего то более навороченного

5. Программа должна работать на Windows, но поля для ввода данных будут находиться на веб-ресурсе.

Будет работать в любом браузере. Но при желании можно сделать windows application (Win forms) WPF, UWP
https://docs.microsoft.com/ru-ru/windows/apps/desk...
Вопрос: Как писать html код в php файле?

Лучший ответ:
не надо писать html код в исполняемом php коде

Худший ответ:
Выберите стартовый файл проекта - или index.html или index.php. Найдите в настрлйках где это выставляется.
Вопрос: Есть будущее у веб-дизайна?

Лучший ответ:
если вы боитесь ИИ, то лучше прямо сейчас накрыться простынкой и медленно ползти в сторону кладбища.

Худший ответ:
Даже люди не могут делать нормальный дизайн, не говоря уже о UX/UI, а вы тут про ИИ говорите... да и сам дизайн (даже в вебе) бывает для разных целей, одно дело если вы одностраничный шаблонный сайт хотите, другое дело если это какой-то сложный многостраничный проект с кучей фреймов и диалоговых окон.
Вопрос: Как бы вы сделали такую ЗАПИСЬ в Wordpress (картинка внутри)?

Лучший ответ:
Я бы СВЕРСТАЛ и ЗАПРОГРАММИРОВАЛ

Худший ответ:
В самом вверху явно карусель или слайдер.
Поищите jQuery скрипты карусели.
Например, 
flexslider.woothemes.com/thumbnail-slider.html
А ниже обычные блоки с фотками по 3 штучки в ряд.

Реализовать можно по разному. Если через виз. редактор, то можно взять Visual Composer || WP Bakery Page Builder и подобрать виджеты для карусели.

Или взять вышеуказанный скрипт + кастомные поля ACF.
А сетку с 3-мя картинками в ряд можно например, при помощи повторителя ACF.
Добавить повторитель (для секции) и поля - заголовок секции (тип поля текст) + 3 картинки (тип поля - галерея)
Вопрос: Есть решения по проверке орфографии?

Лучший ответ:
1. Используйте regex и проверяйте на невалидные цепочки слов и знаков препинания внутри текста перед постингом и нормализуйте токены-разделители. 
2. Проверяйте сами слова на валидные символы (и их цепочки), на ограничение длины и на содержание в стоп-листе.источник<?php
$values = array(
    'text???',
    '???text',
    'text???text',
    'text ? ? ? ? ? text'
);

foreach ($values as $original_value) {
    $value = preg_replace('/([?!.:,;]|\s)\1+/', '$1 ', $original_value);
    echo $original_value . "\n" . $value . "\n\n";
}Результатtext???
text? 

???text
? text

text???text
text? text

text ? ? ? ? ? text
text ? text
Вот либа для русского языка: TypographНа данный момент типограф умеет...Обрабатывать тексты в различных кодировках(требуется iconv).
Заменять кавычки на ёлочки.
Склеивать двойные кавычки.
Заменять знак дефиса или два знака дефиса подряд — на знак длинного тире.
Заменять знак дефиса, ограниченный с обоих сторон цифрами — на знак короткого тире.
Заменять множество пробелов или табуляций на один пробел.
Заменять х в выражениях вроде 10x10 на знак умножения.
Исправлять неправильную расстановку запятых.
Разносить неправильно расставленные кавычки.
Вставлять неразрывный пробел после инициалов, сцеплять инициалы.
Делать неразрывными названия организаций и аббревиатуры форм собственности.
Делать неразрывными имя собственное и относящееся к нему сокращение.
Не разделять 2007 г., ставить пробел, если его нет.
Сцеплять скобки со словами.
Заменять 1/2 1/4 3/4 на спецсимволы.
Следить за тем, чтобы предлоги и союзы не находились в конце строки.
Следить за тем, чтобы частицы бы, ли, же и т.д. не отрывались от предшествующего слова.
Форматировать русские денежные суммы, расставляя пробелы в нужных местах.
Заменять от 3-х до 5-и точек подряд на троеточие.
Притягивать к слову запятые, отделять пробелом от последующего слова.
Притягивать к слову восклицательный знак.
Делать замену для +-.
Обрабатывать вложенные кавычки.
Притягивание чисел к знаку умножения.
Запятые до «а» и «но».
Притягивание «;» к предшествующему слову.
Убирает лишние знаки: «??» в «?», «!!!!» в «!!!».
Правильные апострофы в «LO'Лайт».
Прямая речь.
Неразрывные IP-адреса.
Добавлю ещё, что если есть ограничение на количество символов в объявлении - то сразу лучше ограничить количество слов (2 буквы и более) не несущих смысл (союзы, предлоги и т.д.). Тогда текст объявлений будет намного качественнее для ЛЮДЕЙ (и для поисковиков, конечно)!
Что такое заспамленность в целом (понятия: водность, тошнота текста и др.): тут
Онлайн анализ текста: здесь
Т.е. это должно работать сразу, до принятия объявления системой (т.е., обычно, до его публикации).

Худший ответ:
https://yandex.ru/dev/speller/
Смотрели?
Вопрос: Есть ли смысл переходить на другой стек?

Лучший ответ:
1) Уходить с удаленки, которую ты смог найти на опыт джуна - это прямо мега глупо. Надо хотя бы получить 9-12 месяцев работы, тогда тебя уже начнут рассматривать, как разраба.
А пока HR-видит, что ты через месяц слился и думает: "Да ну его нахер, то ли он конфликтный, то ли он "мамкин айтишник, который хочет 100к со старта", то ли он рукожоп"
т.е. этот опыт лучше вообще убрать из резюме. (ну это так намек)
2) Удаленку без опыта реальной разработки на уровне Джуна - очень сложно найти. Будь ты хоть JS, хоть PHP, хоть Java разработчик. Тут дело не в стеки.
3) В идеале, тебе надо получить строчку в трудовую, что работал программистом условно 9 месяцев (хоть на чем) - после этого, уже и удаленку можно будет найти проще, либо уже уезжать на офер в СПБ, Москву или другой город

Худший ответ:
JavaScript сейчас - это один из самых востребованных и высокооплачиваемых стеков. 
Возможно, вам стоит подкачать свои знания именно в этом стеке, поскольку вы даже в названии языка сделали две ошибки. 
"Java scrit?Я пытался" - подпись к вашей аватаре (и это не говоря уже об отсутствии пробела и точки).
Мелочь, а выдает в вас не очень квалифицированного и не особо внимательного сотрудника. Возможно, и в резюме тоже самое.
Вопрос: На какой площадке открыть дизайн-конкурс?

Лучший ответ:
Практика показывает, что "высокоточный" дизайн, с отличным качеством можно заказать только специалисту, который изучит рынок, конкурентов, создаст персонажей, продумает сценарии, нарисует прототип и сделает дизайн - человек, который будет принимать участие в конкурсе, скорее всего нарисует просто красивую и неудобную обложку, потому что много времени, как правило, на конкурсы никто не тратит.
Хотите крутого дизайнера - зайдите на Behance or Dribble, посмотрите кто делает реально крутые приложения и напишите ему, сделайте ему заказ на 1000$, он вам сделает ооочень крутое приложение, и вы не вкините деньги на ветер.
И да... крутые ребята из Behance и Dribble не участвуют в конкурсах, у них работы и без этого хватает, скорее всего в конкурсе будут участвовать те, у кого нет работы и они хотят себя проявить - то есть новички.

Худший ответ:
Не очень прозрачен контекст задания,
но предложу ситуации, для которых совет Михаил Проскурин не очень подойдёт.
У SuperToster уже есть экраны в фигме, это даёт нам предположить, что общий флоу и сценарии основные готовы.
Вероятно это делал проектировщик, который, вероятно, подумал несколько раз.
Если мы наймём «крутого дизайнера», чтобы он ещё раз прошёлся по всему приложению, то это займёт нормально времени клиента. Мы ведь не знаем масштаб продукта, вдруг у товарища готовы основные скрины по генотипированию образцов для вьетнамской лаборатории в спец сфере исследования.
А вот если реально требуется «раскрасить» макеты, создать и описать полноценный кит для системы, не сильно вдаваясь в сценарии - это хорошая работа для технического дизайнера. И опять же нюанс - всю его работу контролировать и проверять должен тот, кто делал исходные макеты.
И стоимость в $1500-2000 за 2-3 недели работы вполне себе неплохая.
По вопросу ТС:
я бы посоветовал искать через знакомых, либо через hh, выделяя интересные резюме.
Вопрос: Как сделать такой липкий sidebar?

Лучший ответ:
Достаточно будет css свойства 'position: sticky'

https://developer.mozilla.org/ru/docs/Web/CSS/position

Худший ответ:
держи

snippet
Вопрос: Как выбрать активную цену и предыдущую?

Лучший ответ:
Ну так а в чем у вас проблема-то? Вы в принципе не знаете как запрос писать и это задание такое?
Если так, то данный ресурс не для этого.
Если у вас конкретный вопрос, то заайте его конкретно. Что именно у вас не получется?
Не ясно как сформулировать рамочные условия с интервалами, пересекающими конкретную дату?
Не понятно как сгруппировать интервалы по товарам?
Не знаете про coalesce?
Запутались с граничными точками интервалов?
В чем проблема?

Худший ответ:
как-то так решается задача, идея в том, чтобы избавиться от столбца active_to дополнив изначальные данные строками:
WITH
    "prices" (row_id, product_id, active_from, active_to, price) AS (
        VALUES
        (1, 1, '2019-01-01'::date, null, 200),
        (2, 1, '2019-10-01'::date, null, 150),
        (3, 1, '2019-11-01'::date, '2019-11-30'::date, 100),
        (4, 2, '2019-01-01'::date, null, 200),
        (5, 2, '2019-06-01'::date, '2019-08-31'::date, 150),
        (6, 2, '2019-07-01'::date, '2019-09-30'::date, 140),
        (7, 2, '2019-11-01'::date, null, 100),
        (8, 3, '2019-01-01'::date, null, 200),
        (9, 3, '2019-06-01'::date, '2019-10-31'::date, 150),
        (10, 3, '2019-07-01'::date, '2019-09-30'::date, 140),
        (11, 3, '2019-11-01'::date, null, 100)
    )
SELECT
    u."row_id",
    u."product_id",
    u."active_from",
    u."active_to",
    u."price",
    lag(u."price") OVER (PARTITION BY u."product_id" ORDER BY u."effective_date") as "previous_price",
    u."effective_date"
FROM (
    SELECT "u".*,
        coalesce("u"."row_id" = lead("u"."row_id") OVER (PARTITION BY "u"."product_id" ORDER BY "u"."effective_date"), FALSE) AS "exclude_row"
    FROM (
        SELECT "p1".*, "p1"."active_from" AS "effective_date"
        FROM "prices" "p1"
        UNION ALL
        (
            SELECT DISTINCT ON ("prev"."product_id") "prev".*, ("p"."active_to" + '1 day'::interval)::date AS "effective_date"
            FROM "prices" "p"
            LEFT JOIN "prices" "prev" ON "prev"."product_id" = "p"."product_id"
                AND "p"."active_to" > "prev"."active_from"
                AND "p"."active_to" < coalesce("prev"."active_to", now())
            WHERE "p"."active_to" IS NOT NULL
            ORDER BY "prev"."product_id", "prev"."active_from" DESC
        )
    ) "u"
) u
WHERE NOT u."exclude_row"
ORDER BY "product_id", "effective_date"