我有以下数据:
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'
答案 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}}