Запрос на сравнение больше/меньше

197
28 февраля 2019, 11:20

Имеется запрос вида:

SELECT
    measuring.pin_name AS pin_name,
    AVG(measuring.meas) AS meas,
    COUNT(measuring.meas) AS counts
FROM
    measuring,
    list_ims,
    test_name,
    test_variant,
    party_ims
WHERE
    (
        measuring.id_test_variant = test_variant.id AND test_variant.id_test_name = test_name.id
    ) AND(
        measuring.id_party = party_ims.id AND party_ims.id = list_ims.id
    ) AND list_ims.name = '1533ИР39' AND test_name.name = 'Выходное напряжение высокого уровня UOH, В'
GROUP BY
    `pin_name`
ORDER BY
    `measuring`.`pin_name` ASC

На выходе возвращается список вида

pin_name 1 | среднее | количество сущностей с  pin_name 1   
pin_name 2 | среднее | количество сущностей с  pin_name 2
pin_name 3 | среднее | количество сущностей с  pin_name 3

В последствии средствами python считается количество pin_name, после этого среднее каждой сущности сравнивается с пользовательским числом и проверяется если новое количество pin_name осталось прежним, то всё круто, добавляю головной элемент (тот, у кого были все эти pin_name в массив на вывод пользователю), но при этом надо также посчитать количество pin_name у которых значение (уже не среднее) больше/меньше пользовательского значения. Сейчас делаю это через два запроса. Есть ли вариант ещё в исходном считать это сразу? То есть, к примеру пользователь ввёл <=5.0 На выходе запроса получить:

pin_name 1 | среднее | количество сущностей с  pin_name 1 <=5.0 | true или false
pin_name 2 | среднее | количество сущностей с  pin_name 2 <=5.0 | true или false 

Где true - среднее <=5.0, false - обратное.

Answer 1

В более общем случае, для различных СУБД подобное пишут с использованием оператора case и агрегатной функции суммирования:

 select sum(case when meas < 5 then 1 else 0 end)

Для диалекта mysql можно более кратко записать как

select sum(IF(meas < 5, 1, 0))

И поскольку у нас тут либо 0 либо 1, то и вовсе сократить до

select sum( meas < 5)

Схожим образом можно оформить и решение для последнего вашего столбца

select ( avg(meas) < 5 ) as truefalse

Так что ваш запрос дополнится такими строками

SELECT
    measuring.pin_name AS pin_name,
    AVG(measuring.meas) AS meas,
    COUNT(measuring.meas) AS counts,
    SUM(measuring.meas < 5) as c_lt5,
    (AVG(measuring.meas) < 5) as truefalse
READ ALSO
Проблема с синтаксисом mysql

Проблема с синтаксисом mysql

Подаваемая строка

139
Неправильные даты

Неправильные даты

Есть приложение написанное через Spring MVC,Spring JDBCНеобходимо добавлять дату в БД(MYSQL)

157
Последняя колонка Bootstrap уходит вправо [закрыт]

Последняя колонка Bootstrap уходит вправо [закрыт]

Вот здесь колонка (блок) "Балансировка" почему-то уходит вправо, хотя у всех этих блоков стоит float: left;Как сместить ее влево, где она и должна...

124
Вопрос по форматированию pug (jade) в html

Вопрос по форматированию pug (jade) в html

Имеется такая проблема при компиляции pugХоть она не так критична технически, но визуально довольно неприятна

177