我如何获得按多个列分组的每个组中的最后一条记录

问题描述

SELECT symbol,weekno,max(Trade_date) as Trade_date,max(high) as high,min(low) as low,close  -- <----
FROM company_data
WHERE symbol = '$company_name'
  AND weekno <= '$startweek' 
GROUP by symbol,weekno
ORDER BY weekno DESC
LIMIT 2

在上面的示例中,我突出显示代码必须获取每个分组项目中的最新关闭字段

谢谢

解决方法

您需要欣赏的是,对事物进行自动分组会丢弃“值来自的行”的任何概念,因此您不能说要从具有最高任何值的行中获取其他值,因为“同一行”的概念不再存在:

Day,LowTemp,HighTemp
Mon 1st,5,10
Mon 8th,6,12
Mon 15th,4,11

此处的MIN最低温度来自15号星期一,MAX最高温度来自8月8日。没有概念说“找到最低的低温,然后从那一行给我一天”,因为考虑MIN(低温)时,数据库只会看到{ 4,6 },the lowest number is 4,the end-如果不保留任何知识,“此操作的一部分来自于Mon15th的行,其高温为11“

这样,如果您想返回该数据,则必须再次查询它;您必须问:“ MIN低温是多少,好的,它是4,现在所有值都为4的行是什么,好的,我们要使用哪一个或多个?”


在您的示例中,“最新”是由我们看不到的东西定义的,例如某个日期或当天交易的递增计数。也许是trade_date?您将不得不采用查询所提供的结果,就像

Symbol,Week#,max_trade_date,max_high,min_low
MSFT,1,2000-01-06 23:59:59.999,99999,99998

您将不得不将其与一个查询联系起来,以使您能够及时了解最新情况,例如:

SELECT * FROM
(
 SELECT symbol,weekno,max(trade_date) as trade_date,max(high) as high,min(low) as low
 FROM company_data
 WHERE symbol = '$company_name'
   AND weekno <= '$startweek' 
 GROUP by symbol,weekno
 ORDER BY weekno DESC
 LIMIT 2
) x
INNER JOIN company_data y
ON x.symbol = y.symbol AND x.weekno = y.weekno and x.trade_date = y.trade_date
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                      "the latest"

为多于一排做好准备;您必须决定在这种情况下该怎么做,并且需要这样做,以便只有一行。如果您拥有“一天”这样的粗略知识,这可能是不可能的。像微秒这样的精细时间甚至都不可能实现。当您对同时执行的两个交易中的哪一个进行“任意”决策时,您可能必须要达到一点。递增数量会有所帮助;您可以选择每个交易周的最大MAX(incrementing_number),然后加入该交易以找到其收盘价


在MySQL 8中,您可以使用分析使生活中的某些部分变得更轻松,但最终,一切都回到了这样的观念:创建GROUP时,您会丢掉一些信息以组成该组,而又丢掉了其他信息进行MAX / MIN / AVG等操作-您不能同时保留并丢弃信息,因此您可以说“ MAX x哦,还有同一行中的其他值”,您只能获得MAX,然后加入再次最大程度地返回到详细数据,以满足“哦和同一行中的其他数据”部分

,

欢迎来到SO。在我头顶上,您正在使用聚合查询(使用group by,然后聚合函数)。但是,您所寻找的并不是作为分组依据而自然产生的东西,而是本质上更多的窗口/分区(在符号/公司名称上)。因此,您需要使用联接/联合来扩充查询语句,并使用mysql CTE或分析函数来获取最新的关闭字段值,或者可以按照@Caius Jard的建议进行操作。

要给您提供指针,请考虑按顺序对by by子句进行划分的等级/行数。