Мы тут с коллегами посидели, подумали. SQL запрос получается монструозный с кучей джойнов и агрегатов. Если модифицировать хранилище, то будет гораздо проще. Добавить колонку period_start. При добавлении новой цены, смотреть на предыдущую цену и если она не совпадает с добавляемой писать туда текущую дату. Если совпадает, то писать туда значение period_start из предыдущей записи. И при выборе группировать по period_start.
Вячеслав, только что проверил. У моего кода есть один недостаток. Он игнорирует ключи массивов.
Т.е. если у нас три массива с 10 элементами, но у одного пропущен ключ 5, то шестой элемент станет пятым и так далее. Т.е. array_map применяет к входным массивам array_values
Вячеслав, согласен, можно и isset сделать. Но зачем, если sprintf отлично справится с null значениями, которые ему отдаст array_map.
Это замечательная функция. Не пренебрегайте ей.
Вместо единицы подставляйте нужный id языка