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
а как вы группируете по агрегату вообще?
lost
20.02.2018
11:02:03
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
Crestoff
20.02.2018
11:04:49
повторюсь запрос работает
Ilia
20.02.2018
11:04:53
Vladislav
20.02.2018
11:04:53
требую скриншот, как работает данный запрос
Crestoff
20.02.2018
11:04:57
ща
lost
20.02.2018
11:05:22
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
Ilia
20.02.2018
11:06:52
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
или же занов о пересчитать
ко?TEXHIK
20.02.2018
11:08:06
Google
Ilia
20.02.2018
11:08:08
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
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
можно через сессионку рассчитать первое значение и в зависимости от него аггрегировать второе. Ну или я ща херню сморозил, надо поковырять... Хотя не, надо наверное с подзапросом или скаляркой, сессионку с агрегатом не подружить в этом случае
Ilia
20.02.2018
11:14:34
lost
20.02.2018
11:14:39
Ilia
20.02.2018
11:14:55
Crestoff
20.02.2018
11:15:14
я и сам знаю что гавно)
но от этого задача у меня не меняется...
Ilia
20.02.2018
11:16:42
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, как минимум
lost
20.02.2018
11:18:48
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
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
так я с тобой сейчас дискутирую, при чем тут топикстартер
Ilia
20.02.2018
11:21:13
А, давай
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 исключаешь ненужные записи, вот и всё.
Crestoff
20.02.2018
11:24:24
я хотел избежать этого, поэтому сюда обратился.
Валерия
20.02.2018
11:31:56
а нельзя сделать exist ? что-то из разряда
если есть хотя бы одна запись в таблице с таким же id>0 - среднее уже больше нуля будет. и тогда можно ничего не убирать OR z > 500