繁体   English   中英

MySQL没有选择日期为MAX的行的值

[英]mySQL is not selecting the values of the row with the MAX date

我有以下数据:

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

然后,我编写了以下查询,以尝试获取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

为什么会这样呢?

编辑:这是在一个联接内,但那部分没有工作。 这是完整的查询:

 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'

汇总功能无法正常发挥作用。 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

MySQL应该从每组的哪一行取LAST_10_DAYS的值? 日期最大的行? 日期最低的行? 如果在最大日期中并列了多行,即两行或多行具有相同的日期,但LAST_10_DAYS值不同, LAST_10_DAYS怎么LAST_10_DAYS

那AVG_DATE呢? 也许平均日期不在表的任何行上。 那么您期望LAST_10_DAYS的值是LAST_10_DAYS

您试图获得的不仅是最大值,而且是出现该值的行。

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.TRADE_DATE 
FROM AR_STOCK_QUOTE AR_SQ 
INNER JOIN FF_HISTORICAL_STOCK_PRICE RS
  ON RS.SYMBOL = AR_SQ.SYMBOL
INNER JOIN (
  SYMBOL, MAX(TRADE_DATE) AS TRADE_DATE
  FROM FF_HISTORICAL_STOCK_PRICE
  GROUP BY SYMBOL 
) MAXRS 
  ON RS.SYMBOL = MAXRS.SYMBOL AND RS.TRADE_DATE = MAXRS.TRADE_DATE
JOIN FF_PRIMARY_STOCK_TABLE FF_PS on FF_PS.SYMBOL = AR_SQ.SYMBOL 
WHERE RS.SYMBOL = 'ADI'

子查询返回交易品种,以及每个交易品种的最大交易日期。 然后,您需要将该值再次加入股票价格表,以找到该日期所在的行。 然后,您可以从该行中获取其他列。

您可以将其用作子查询:

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的最大日期的聚合方法要快。

你应该使用一个条件

  SELECT SYMBOL, TRADE_DATE , LAST_10_DAYS 
  FROM FF_HISTORICAL_STOCK_PRICE 
  WHERE SYMBOL='ADI' 
  AND trade_date = (select MAX(TRADE_DATE)  FROM FF_HISTORICAL_STOCK_PRICE   )

对于完整的查询,您可以使用它(与适当的分组依据

 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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM