MySQL - Max () возвращает неверный результат - PullRequest
0 голосов
/ 09 ноября 2010

Я пробовал этот запрос на сервере MySQL (5.1.41) ...

SELECT max(volume), dateofclose, symbol, volume, close, market FROM daily group by market

Я получил такой результат:

max(volume) dateofclose symbol  volume  close   market
287031500     2010-07-20  AA.P    500     66.41   AMEX
242233000     2010-07-20  AACC    16200   3.98    NASDAQ
1073538000   2010-07-20  A       4361000 27.52   NYSE
2147483647   2010-07-20  AAAE.OB 400     0.01    OTCBB
437462400     2010-07-20  AAB.TO  31400   0.37    TSX
61106320       2010-07-20  AA.V    0       0.24    TSXV

Как видите, максимальный объемОЧЕНЬ отличается от «реального» значения столбца тома?!?

Столбец тома определен как int (11), и я получил 2 миллиона строк в этой таблице, но это очень далеко от максимума хранилища MyISAMтак что я не могу поверить, что это проблема !?Что также странно, так это то, что данные показываются с той же даты (dateofclose).Если я задаю конкретную дату с помощью предложения WHERE, один и тот же символ получился с другим результатом max (volume).Это довольно странно ...

Нужна помощь здесь!

ОБНОВЛЕНИЕ:

Вот мой отредактированный "рабочий" запрос:

SELECT a.* FROM daily a 
INNER JOIN ( 
SELECT market, MAX(volume) AS max_volume 
FROM daily 
WHERE dateofclose = '20101108' 
GROUP BY market 
) b ON 
a.market = b.market AND 
a.volume = b.max_volume

Итакэто дает мне, по рынку, запасы наивысшего объема (на 8 ноября 2010 г.).

Ответы [ 3 ]

7 голосов
/ 09 ноября 2010

Как видите, максимальный объем ОЧЕНЬ отличается от «реального» значения столбца тома?!?

Это потому, что MySQL довольно странно не GROUP вещи чувственным образом.

Выбор MAX(column) даст вам максимальное значение для этого столбца, но выбор других столбцов (или column сам) будет не обязательно выбрать весьстрока, в которой находится найденное MAX() значение. По сути, вы получаете произвольную (и обычно бесполезную) строку назад.

Вот поток с некоторыми обходными путями, использующими подзапросы: Как выбрать строки с помощью MAX (Значение столбца), DISTINCT другим столбцом в SQL?

2 голосов
/ 09 ноября 2010

Это подмножество проблемы «наибольшее число на группу».(Существует тег с таким именем, но я новый пользователь, поэтому я не могу пометить его заново).

Обычно это лучше всего обрабатывать аналитической функцией, но также можно записать с помощью присоединения к подпрограмме.запрос с использованием той же таблицы.В подзапросе вы определяете максимальное значение, затем присоединяетесь к исходной таблице по ключам, чтобы найти строку, которая соответствует максимуму.

Предполагая, что {dateofclose, symbol, market} является зерном, на которомхотите максимальную громкость, попробуйте:

select
    a.*, b.max_volume
from daily a
join
(
    select
        dateofclose, symbol, market, max(volume) as max_volume
    from daily
    group by
        dateofclose, symbol, market
) b
on
    a.dateofclose = b.dateofclose
    and a.symbol = b.symbol
    and a.market = b.market

Также см. этот пост для справки.

0 голосов
/ 09 ноября 2010

Вы пытались настроить свой запрос на включение символа в группу?

    SELECT max(volume), dateofclose, symbol, 
   volume, close, market FROM daily group by market, symbol
...