[英]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.