@dba_ru

Страница 425 из 718
Crestoff
20.02.2018
11:00:47
помогите составить запрос плиз есть вот такой SELECT id, sum(avg(X)*avg(Y)) AS K FROM table WHERE Z>500 GROUP BY K нужно сделать запрос так чтобы если avg(X) = 0, то игнорировалось бы условие Z>500 возможно ли это ? )

Vladislav
20.02.2018
11:01:54
а как вы группируете по агрегату вообще?

Crestoff
20.02.2018
11:02:28
этот запрос работает отлично

Google
Crestoff
20.02.2018
11:02:36
но как сделать то что я хочу

Ilia
20.02.2018
11:03:10
Crestoff
20.02.2018
11:03:22
ёёё

SELECT id, round(avg(X)*avg(Y)) AS K FROM table WHERE Z>500 GROUP BY K

вот такой запрос сейчас работает

нужно сделать запрос так чтобы если avg(X) = 0, то игнорировалось бы условие Z>500

что конкретно в моём рабочем запросе не так?

Ilia
20.02.2018
11:04:14
SELECT id, round(avg(X)*avg(Y)) AS K FROM table WHERE Z>500 GROUP BY K
Должно быть GROUP BY id, или запрос НЕ будет работать

Crestoff
20.02.2018
11:04:49
повторюсь запрос работает

Ilia
20.02.2018
11:04:53
нужно сделать запрос так чтобы если avg(X) = 0, то игнорировалось бы условие Z>500
Такое не очень-то сразу напишешь, да и ты недоговариваешь условия.

Vladislav
20.02.2018
11:04:53
требую скриншот, как работает данный запрос

Crestoff
20.02.2018
11:04:57
ща

Google
Ilia
20.02.2018
11:05:33
повторюсь запрос работает
Парень, если у тебя тот запрос работает, то и НУЖНЫЙ ТЕБЕ ТЫ ЛЕГКО НАПИШЕШЬ, ПОТОМУ ЧТО ТЫ — ВОЛШЕБНИК!

Crestoff
20.02.2018
11:05:41
фублиин

да групировка идёт по IS

id

))

не верно пример написал

давайте заново?

SELECT id, round(avg(X)*avg(Y)) AS K FROM table WHERE Z>500 GROUP BY id вот такой запрос сейчас работает нужно сделать запрос так чтобы если avg(X) = 0, то игнорировалось бы условие Z>500

Anton
20.02.2018
11:06:44
Так оно по нём уже посчиталось

для z>5000

Anton
20.02.2018
11:06:57
Или тебе во втором агрегате надо игнорировать

Vladislav
20.02.2018
11:07:07
теперь мне интересно, как работает where без группировки

Anton
20.02.2018
11:07:25
@SLASH_CyberPunk не вижу проблемы

Crestoff
20.02.2018
11:07:26
))))

Anton
20.02.2018
11:07:44
@crestoff смари, avg(x) у тебя уже посчитано для z>500

Где тебе игнорить, для avg(y)?

Crestoff
20.02.2018
11:07:58


Anton
20.02.2018
11:08:00
или же занов о пересчитать

Google
Crestoff
20.02.2018
11:08:24
в условии нельзя делать AVG

ко?TEXHIK
20.02.2018
11:08:39
having патамушта

Crestoff
20.02.2018
11:08:52
в WHERE

having не подходит

потому что выборка уже будет сделана с нулями

Ilia
20.02.2018
11:09:26
SELECT id, round(avg(X)*avg(Y)) AS K FROM table WHERE Z>500 GROUP BY id вот такой запрос сейчас работает нужно сделать запрос так чтобы если avg(X) = 0, то игнорировалось бы условие Z>500
Но в целом, тебе надо делать эту агрегацию дважды, в двух подзапросах. Сначала вычислить нужные агрегаты, потом для них уже опционально снова выбрать нужные данные, применяя или нет условия, и снова агрегировать.

Vladislav
20.02.2018
11:09:27
Anton
20.02.2018
11:09:57
если запрос не сильно тяжёлый, можно в подзапросе подсчитать avg(x) а дальше уже заново пересчитать avg(y) по условию avg(x)

не хайлоад-решение конечно, но работать буит

Crestoff
20.02.2018
11:10:43
запрос не очень то лёгкий SELECT `id`, `show_volume`, `url`, ROUND(AVG(log_ad_spot.cpm)*SQRT(AVG(log_ad_spot.paid)),6) as k FROM `ad_spot` LEFT JOIN `log_ad_spot` ON `ad_spot`.`id` = `log_ad_spot`.`ad_spot_id` WHERE ((`status_is_reserved`=0) AND (`status_price`=0) AND (`status_fixed_priority`=0) AND (`log_ad_spot`.`country_id`=208)) AND (`time` >= UNIX_TIMESTAMP() - ad_spot.price_analise_period) AND (`id` IN (73, 72, 71, 70, 69)) GROUP BY `id` ORDER BY `k` DESC

Ilia
20.02.2018
11:10:56
И ?

Crestoff
20.02.2018
11:10:58
поэтому хотелось бы избежать двойного

запроса

Ilia
20.02.2018
11:11:28
Да насрать. Ты даже представление не имеешь, где лёгкий запрос, а где нет. Так что не думай, а делай.

По другому всё равно никак

Anton
20.02.2018
11:11:49
@MasterZiv как))))

но шибко зависит от слективности Z

Ilia
20.02.2018
11:12:26
@MasterZiv как))))
Ну, давай свой вариант, если ты понимаешь, что этому человечку надобно...

Crestoff
20.02.2018
11:12:37
не понятно как

Google
Crestoff
20.02.2018
11:12:44
я же сказал что мне нужно

SELECT id, round(avg(X)*avg(Y)) AS K FROM table WHERE Z>500 GROUP BY id вот такой запрос сейчас работает нужно сделать запрос так чтобы если avg(X) = 0, то игнорировалось бы условие Z>500

Ilia
20.02.2018
11:13:12
Игнорировать ГДЕ?

Crestoff
20.02.2018
11:13:36
в WHERE

Anton
20.02.2018
11:13:44
@MasterZiv ну описал же он выше, во втором агрегате

не кипятись))))

lost
20.02.2018
11:13:47
при подсчете avg(y), теперь понятно кто телепузик

Ilia
20.02.2018
11:13:57
Ну, тогда другой запрос надо делать.

Crestoff
20.02.2018
11:14:16
где?

Anton
20.02.2018
11:14:30
можно через сессионку рассчитать первое значение и в зависимости от него аггрегировать второе. Ну или я ща херню сморозил, надо поковырять... Хотя не, надо наверное с подзапросом или скаляркой, сессионку с агрегатом не подружить в этом случае

lost
20.02.2018
11:14:39
Ну, тогда другой запрос надо делать.
Ты начал не с той стороны. Сначала напиши, что MySQL говно.

Crestoff
20.02.2018
11:15:14
я и сам знаю что гавно)

но от этого задача у меня не меняется...

Ilia
20.02.2018
11:16:42
SELECT id, round(avg(X)*avg(Y)) AS K FROM table WHERE Z>500 GROUP BY id вот такой запрос сейчас работает нужно сделать запрос так чтобы если avg(X) = 0, то игнорировалось бы условие Z>500
Ты посчитал, что avg(X) при z > 500 равен нулю. Ты УЖЕ применил это условие. так ? ГДЕ же ты его теперь хочешь игнорировать?

SELECT `id`, `show_volume`, `url`, ROUND(AVG(log_ad_spot.cpm)*SQRT(AVG(log_ad_spot.paid)),6) as k FROM `ad_spot` LEFT JOIN `log_ad_spot` ON `ad_spot`.`id` = `log_ad_spot`.`ad_spot_id` WHERE ((`status_is_reserved`=0) AND (`status_price`=0) AND (`status_fixed_priority`=0) AND (`log_ad_spot`.`country_id`=208)) AND (`time` >= UNIX_TIMESTAMP() - ad_spot.price_analise_period) AND (`id` IN (73, 72, 71, 70, 69)) GROUP BY `id` ORDER BY `k` DESC Этот запро у тебя тоже неверный. Не хватает полей в GROUP BY. Надо добавить show_volume, url, как минимум

Ilia
20.02.2018
11:19:24
Ты посчитал, что avg(X) при z > 500 равен нулю. Ты УЖЕ применил это условие. так ? ГДЕ же ты его теперь хочешь игнорировать?
Короче, путь к правильному запросу идёт от постановки задачи. Пока у тебя её нет. Сформулируй. Потом будет легче даже тебя самому если сам будешь делать.

Google
lost
20.02.2018
11:19:40
По гадальному шару, ёпт

Crestoff
20.02.2018
11:19:51
если брать запрос

Ilia
20.02.2018
11:19:58
Я ВЕЛИКИЙ МАГ И ВОЛШЕБНИК!

Crestoff
20.02.2018
11:20:04
SELECT `id`, `show_volume`, `url`, ROUND(AVG(log_ad_spot.cpm)*SQRT(AVG(log_ad_spot.paid)),6) as k FROM `ad_spot` LEFT JOIN `log_ad_spot` ON `ad_spot`.`id` = `log_ad_spot`.`ad_spot_id` WHERE ((`status_is_reserved`=0) AND (`status_price`=0) AND (`status_fixed_priority`=0) AND (`log_ad_spot`.`country_id`=208)) AND (`time` >= UNIX_TIMESTAMP() - ad_spot.price_analise_period) AND (`id` IN (73, 72, 71, 70, 69)) GROUP BY `id` ORDER BY `k` DESC

то суть такая

lost
20.02.2018
11:20:12
Если эти две колонки функционально зависят от первичного ключа - не нужна там группировка по 3 колонкам.

Crestoff
20.02.2018
11:20:30
я хочу получить айди

Ilia
20.02.2018
11:20:30
Утипути какие слова -то знаешь?
Надо выяснить, знает ли эти слова ещё и топикстартер!

lost
20.02.2018
11:21:06
так я с тобой сейчас дискутирую, при чем тут топикстартер

Crestoff
20.02.2018
11:22:27
чтобы если AVG(cpm)!=0 в заданом промежутке времени либо если AVG(cpm) в это промежутке времени равна ноль, то игнорировать условие с промежутком времени, т.е. брать значения за весь период

Ilia
20.02.2018
11:23:04
Ну и я тебе уже сказал путь — тебе надо писать НЕСКОЛЬКО подзапросов с группировками.

И JOINить их.

Crestoff
20.02.2018
11:24:10
да это понятно

lost
20.02.2018
11:24:19
SELECT `id`, `show_volume`, `url`, ROUND(AVG(log_ad_spot.cpm)*SQRT(AVG(log_ad_spot.paid)),6) as k FROM `ad_spot` LEFT JOIN `log_ad_spot` ON `ad_spot`.`id` = `log_ad_spot`.`ad_spot_id` WHERE ((`status_is_reserved`=0) AND (`status_price`=0) AND (`status_fixed_priority`=0) AND (`log_ad_spot`.`country_id`=208)) AND (`time` >= UNIX_TIMESTAMP() - ad_spot.price_analise_period) AND (`id` IN (73, 72, 71, 70, 69)) GROUP BY `id` ORDER BY `k` DESC
если ты хочешь, чтобы у тебя второй агрегат считался от значения первого - делаешь ещё один left join, на который будут накладываться те же самые ограничения при соединении, и в avg уже с помощью IF исключаешь ненужные записи, вот и всё.

Валерия
20.02.2018
11:31:56
а нельзя сделать exist ? что-то из разряда если есть хотя бы одна запись в таблице с таким же id>0 - среднее уже больше нуля будет. и тогда можно ничего не убирать OR z > 500

Страница 425 из 718