Добрый день. Есть таблица такого вида: Код (Text): Status | Duration 1 | 20 1 | 15 0 | 13 Нужно из этой таблицы другую, где бы было два столбца Duration отличающиеся по статусу. Выглядеть должно например так: Код (Text): Duration1 | Duration2 20 | 13 15 | NULL То есть если в одном столбце количество значений не совпадает, писало NULL. Сейчас я делаю тупо два запроса где отличаются WHERE Status: PHP: SELECT Duration FROM database WHERE Status = 1 SELECT Duration FROM database WHERE Status = 0 Можно одним запросом же?
Дошел прока до такого, но результат не такой какой хочется: Код (Text): SELECT case when Status = 1 then Duration end as Duration1, case when Status = 0 then Duration end as Duration2 FROM database На выходе получаю: Код (Text): Duration1 | Duration2 20 | NULL 15 | NULL NULL |13 Что я не доделал, подскажите пожалуйста.
Очень трудно подобрать цензурные слова, глядя на то, что вы творите. --- Добавлено --- полагаю и вам не мешало бы книжек почитать
Возможно, не отрицая, но я слышал такую формулировку "Оператор UNION позволяет обединить две однотипных выборки. Эти выборки могут быть из разных таблиц или из одной и той же таблицы." Что же вы тогда предлагаете?
Я как бы догадался, что речь о слухах (тут и к бабке не пойду), поэтому и предложил прочесть как и для чего используется конструкция UNION. Не заниматься оккультизмом и не ставить перед собой противоестественные для реляционной БД задачи. Можно конечно использовать "суррогатный" ключ по которому потом объединить эти выборки, но по сути это ересь. И если возникают подобного рода потребности, значит проблема в архитектуре БД.
Ну от вроде, не пытается их сопоставить, а просто, одну колонку разделить на 2. Мб это и хрень, но всё же.
@Artur_hopf, на форуме много раз говорили, что надо озвучивать саму проблему, а не то как ты сам видишь решение. P.S. У Арбенина есть строки: " День дожидался темноты, Жизнь начиналась с середины" Давайте середину оставим Арбенину, а проблему описывать с самого начала.
@Valick Проблему я решил. А надо было потянуть значения с Status = 1 и с Status = 0. Потом суммировать каждую строку с соседней, чтобы получить полный цикл времени в секундах. Duration это время в секундах. Там где оно равно нулю это сколько времени понадобилось в начале, единица это сколько времени занял сам процесс. Итого получаем полный цикл жизни. Потом мне надо было вывести среднеквадратичное отклонение. И в конце проигнорировать значения которые выходят за отклонения. Я все это сделал, просто использовал два запроса. Вот в итоге за один день разобрался: PHP: public function getDuration($id){ $query0 = new Query; $query1 = new Query; $time = ModelView1::timeShift(); $oid = ModelView1::oid(); $query0->select('Duration'); $query0->from('database AS RF'); $query0->leftjoin('database2 AS RR', 'RF.Reader = RR.Oid'); $query0->where(['RR.Asset' => $oid[$id]]); $query0->andWhere(['RF.Status' => 0]); $query0->andWhere("RF.Date BETWEEN DATEADD(hour,".$time[0].", DATEDIFF(dd, 0, GETDATE())) AND DATEADD(hour,".$time[1].", DATEDIFF(dd, 0, GETDATE()))"); $query0->orderBy(['RF.Date' => SORT_DESC]); $status0 = $query0->column(); $query1->select('Duration'); $query1->from('database AS RF'); $query1->leftjoin('database2 AS RR', 'RF.Reader = RR.Oid'); $query1->where(['RR.Asset' => $oid[$id]]); $query1->andWhere(['RF.Status' => 1]); $query1->andWhere("RF.Date BETWEEN DATEADD(hour,".$time[0].", DATEDIFF(dd, 0, GETDATE())) AND DATEADD(hour,".$time[1].", DATEDIFF(dd, 0, GETDATE()))"); $query1->orderBy(['RF.Date' => SORT_DESC]); $status1 = $query1->column(); if(count($status1) > 0){ foreach($status1 as $key=>$val) { if(isset($status0[$key])){ $status1[$key] += $status0[$key]; }else{ $status1[$key] += 0; } } return ModelView1::createPointVTC($status1); }else{ return 0; } } public function createPointVTC($status1){ $sum = array_sum($status1); $mean = $sum / count($status1); $sqrt = ModelView1::arraySqrt($status1, $mean); $plus = $mean + $sqrt; $minus = $mean - $sqrt; $filter = array_filter($status1, function($k) use ($plus, $minus) { return $k > $plus || $k < $minus; }); if(count($filter) > 0){ $sumFilter = array_sum($filter); }else{ $sumFilter = $sum; } $sr_rms = ($sum - $sumFilter)/(count($status1) - count($filter)); return round($sr_rms); } public function arraySqrt($arr, $mean){ $var = 0.0; foreach ($arr as $i){ $var += pow($i - $mean, 2); } $size = count($arr) - 1; return (float) sqrt($var)/sqrt($size); }
эти соседние строки я так понимаю не связаны никаким ключём, а исключительно "по щучьему веленью, по моему хотенью..." сдаётся мне как лиса и сыр "басню сильно сократили", и тот кто создавал бд слыхом не слыхивал про нормализацию данных при грамотной архитектуре бд вся задача должна решаться на уровне СУРБД