Исключить часть результатов при выборке

FB3

Новичок
Исключить часть результатов при выборке

Есть вот такой запрос:
[sql]SELECT CEIL(AVG(`play_money`)) 'average_play_money', `level`
FROM `players`
WHERE `level` IS NOT NULL
GROUP BY `level`[/sql]

Хочется, чтобы в запросе не учитывались 20% максимальных значений `play_money`.
Т.е., если к примеру, таблица такая:
level, play_money
5, 5000
5, 6000
5, 7000
5, 8000
5, 10000
6, 10000
6, 11000
6, 12000
6, 13000
6, 15000

то результат должен быть таким:
5, 6500
6, 11500

Читаю мануал по функциям http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html, но че-то не могу найти ничего подходящего.
Вижу вариант вложенного запроса, но как в нем отрезать лишние, пока тоже не доходит.
 

Gas

может по одной?
вроде как-то так:

Код:
SELECT CEIL( AVG( p.`play_money` ) ) AS average_play_money, p.`level`
FROM
(
  SELECT MAX(play_money) AS max_money, `level` 
  FROM players 
  WHERE `level` IS NOT NULL 
  GROUP BY `level`
) AS m
JOIN players AS p ON p.level=m.level 
WHERE p.play_money < m.max_money * 0.8
GROUP BY p.`level`
 

FB3

Новичок
Спасибо. Интересное решение. Но это не совсем то. Плохо вопрос задал :) Если бы такое нужно было, то, скорей всего, сам бы допер, хотя не факт :)

Надо отсечь 20% записей, у которых максимальное количество денег. Т.е. зависимость чтобы выборка ограничивалась 80% кол-ва пользователей, а не кол-вом play_money у них.

Пока что сделал в цикле запросы. Сначала COUNT(*) GROUP BY `level`, потом со вложенным запросом с LIMIT и все это в цикле.
[sql]SELECT `level`, FLOOR(COUNT(*) * 0.8) 'count' FROM `players` WHERE `level` IS NOT NULL GROUP BY `level`[/sql]
[sql]SELECT
CEIL(AVG(`play_money`))
FROM (SELECT `play_money` FROM `players`
WHERE `level` = {$record['level']}
ORDER BY `play_money`
LIMIT {$record['count']} ) AS tbl[/sql]
ЗЫ: А тэги SQL самовольно форматируют код еще, кроме как подсвечивают? :)
 

Gas

может по одной?
И при таком условии можно сделать один запрос

[sql]
SELECT CEIL( AVG( p.`play_money` ) )
FROM
(
SELECT @i:=0, @level:='', `level` , FLOOR( COUNT( * ) * 0.8 ) 'count'
FROM `players`
WHERE `level` IS NOT NULL
GROUP BY `level`
) AS c
JOIN (
SELECT `play_money`, `level`, IF(@level<>`level`, IF(@level:=`level`, @i:=1, 1), @i:=@i+1) AS position
FROM `players`
ORDER BY `level`, `play_money`
) AS p
ON c.level=p.level
WHERE p.position < c.count
GROUP BY p.`level`
[/sql]

не уверен что запрос заработает, но даже если и да, то лучше его не использовать :)

p.s. инициализацию @i := 0, @level := '' можно вынести в отдельный запрос, я её вставил в текущий чтоб как здесь любят - было всё "одним запросом" )
 

FB3

Новичок
Ну в принципе, так как скрипт запускается раз в сутки, т.е. не высоконагруженный, то думаю, что хватит и того, что я придумал. Секунд за 30 должен выполниться, ничего страшного не должно случиться.
 
Сверху