mySQL没有选择带有MAX日期的行的值

时间:2016-07-19 20:42:25

标签: mysql

我有以下数据:

SYMBOL     | TRADE_DATE | LAST_10_DAYS
----------------------------------
ADI        | 2016-01-08 | NULL
ADI        | 2016-01-07 | NULL
ADI        | 2016-01-06 | NULL
ADI        | 2016-01-05 | NULL
ADI        | 2016-01-04 | NULL
ADI        | 2015-07-06 | 4.5

然后我编写了以下查询以尝试获取MAX日期的LAST_10_DAYS列中的值:

SELECT SYMBOL, MAX(TRADE_DATE) as MAX_DATE, LAST_10_DAYS 
FROM FF_HISTORICAL_STOCK_PRICE 
WHERE SYMBOL='ADI' 
GROUP BY SYMBOL

当我这样做时,我希望得到以下结果:

SYMBOL     | TRADE_DATE | LAST_10_DAYS
----------------------------------
ADI        | 2016-01-08 | NULL

但是,我得到以下输出:

SYMBOL     | TRADE_DATE | LAST_10_DAYS
----------------------------------
ADI        | 2016-01-08 | 4.5

为什么会这样?

编辑:这是在一个JOIN内,但那部分不起作用。以下是完整查询:

 SELECT AR_SQ.SYMBOL, AR_SQ.NAME, AR_SQ.LAST, FF_PS.SECTOR, FF_PS.SECTOR_TAGS, RS.LAST_10_DAYS, RS.YTD_PERF, RS.MaxDate 
 FROM AR_STOCK_QUOTE AR_SQ 
 INNER JOIN (
 SELECT HP.SYMBOL, max(TRADE_DATE) as MaxDate, HP.LAST_10_DAYS, HP.YTD_PERF 
 FROM FF_HISTORICAL_STOCK_PRICE HP 
 GROUP BY HP.SYMBOL 
 ) RS on RS.SYMBOL = AR_SQ.SYMBOL 
 JOIN FF_PRIMARY_STOCK_TABLE FF_PS on FF_PS.SYMBOL = AR_SQ.SYMBOL 
 WHERE RS.SYMBOL = 'ADI'

3 个答案:

答案 0 :(得分:1)

汇总功能不会影响您的工作方式。 private不会选择出现最大值的行。它从命名列返回最大的。这个值可能出现在每一行上!

考虑以下问题:

MAX()

每个组中哪一行应该使用SELECT SYMBOL, MAX(TRADE_DATE) as MAX_DATE, MIN(TRADE_DATE) as MIN_DATE, AVG(TRADE_DATE) as AVG_DATE, LAST_10_DAYS FROM FF_HISTORICAL_STOCK_PRICE WHERE SYMBOL='ADI' GROUP BY SYMBOL 的值?有最大日期的行?日期最短的行?如果最多日期绑定多行,即两行或多行具有相同的日期,但LAST_10_DAYS的值不同,该怎么办?

AVG_DATE怎么样?也许平均日期不会出现在表格的任何行上。那么你期望什么是LAST_10_DAYS的价值?

您要获得的不仅是最大值,还包括该值出现的行。

LAST_10_DAYS

子查询返回符号,以及每个符号的最大交易日期。然后,您需要再次将该值加入股票价格表,以查找该日期发生的行。然后你可以从那一行获得其他列。

答案 1 :(得分:1)

您可以将其用作子查询:

SELECT SYMBOL, TRADE_DATE as MAX_DATE, LAST_10_DAYS, YTD_PERF  
FROM FF_HISTORICAL_STOCK_PRICE 
WHERE SYMBOL='ADI' 
ORDER BY TRADE_DATE DESC
LIMIT 1

由于您要过滤SYMBOL,因此这比找到所有SYMBOL的最大日期的汇总方法更快。

答案 2 :(得分:0)

您应该使用条件

 SELECT AR_SQ.SYMBOL, AR_SQ.NAME, AR_SQ.LAST, FF_PS.SECTOR, FF_PS.SECTOR_TAGS, RS.LAST_10_DAYS, RS.YTD_PERF, RS.MaxDate 
 FROM AR_STOCK_QUOTE AR_SQ 
 INNER JOIN (
 SELECT HP.SYMBOL, max(TRADE_DATE) as MaxDate
 FROM FF_HISTORICAL_STOCK_PRICE HP 
 GROUP BY HP.SYMBOL 
 ) RS on RS.SYMBOL = AR_SQ.SYMBOL 
 INNER JOIN FF_PRIMARY_STOCK_TABLE FF_PS on FF_PS.SYMBOL = AR_SQ.SYMBOL 
 WHERE RS.SYMBOL = 'ADI'

对于完整查询,您可以使用此功能(使用适当的组

{{1}}