В основата си това изглежда като проблем с база данни.
Задайте колоната с проценти като NOT NULL и задайте 0 като DEFAULT.
ALTER TABLE promotions CHANGE COLUMN percent [maintain-its-type] NOT NULL DEFAULT '0';
След това става въпрос за (ако разбирам проблема) извличане на процентните стойности MAX() и MIN() за всяка дата.
SELECT s.date, s.rate, MAX(p.percent) AS maxperc, MIN(p.percent) AS minperc
FROM stock s
LEFT JOIN promotions p ON s.date = p.date
WHERE s.date BETWEEN '2017-01-29' AND '2017-01-31'
GROUP BY s.date,s.rate;
...не съм го тествал, така че може да се наложи малко работа.
След това, докато преминавате през набора от резултати, можете да декларирате двата отделни подмасива и да изградите своя пълен масив.
$array=[];
$i=0;
while($row=mysqli_fetch_assoc($result)){
$array[0][$i]["date"]=$row["date"];
$array[0][$i]["rate"]=$row["rate"];
$array[0][$i]["perc"]=$row["minperc"];
$array[1][$i]["date"]=$row["date"];
$array[1][$i]["rate"]=$row["rate"];
$array[1][$i]["perc"]=$row["maxperc"];
++$i;
}
До този момент направих твърде много предположения за вашата цел/използване. По принцип задайте нула като процент по подразбиране, потърсете най-висок и най-нисък процент за всяка двойка дата-скорост (ако е нула, тогава нула ще се появи като най-висок и най-нисък стойност). Направете каквото искате с набора от резултати.