获取与聚合相关的回线,例如分钟
Posted
技术标签:
【中文标题】获取与聚合相关的回线,例如分钟【英文标题】:Get back line associated with aggrigate e.g. min 【发布时间】:2017-01-13 18:34:26 【问题描述】:您好,我想知道是否有办法从与 min 关联的行中获取信息。因此,在下面的示例中,我想简单地获取每个客户的 min(date) 和相关信息。
Cust_id Date information
-----------------------------------------------------
12345 2015-04-03 blue hat
12345 2015-04-05 red scarf
12345 2015-04-02 blue hat
12345 2015-04-08 yellow submarine
54321 2015-04-12 yellow submarine
结果如下所示:
Cust_id Date information
-----------------------------------------------------
12345 2015-04-02 blue hat
54321 2015-04-12 yellow submarine
目前,为了解决这个问题,我会使用临时表或子查询来获取每个客户的 min(date) 并在该日期重新加入表。
SELECT cust_id
, MIN(date)
INTO #TempTable
FROM dataset
GROUP BY cust_id
SELECT cust_id
, date
, information
FROM dataset A INNER JOIN #TempTable B ON A.cust_id = B.cust_id
AND A.date = B.date
这种方法有效,但我想有一种更清洁、更简单的方法可以一次性完成。也许是我不知道的功能?
非常感谢您对此提供任何帮助、建议、示例或资源,
谢谢,
鲍勃
【问题讨论】:
是的,在子查询中选择分钟,然后在外部查询中加入主表。这里有很多关于 SO 的主题,如果需要,可以为您提供示例代码。 使用临时表或派生表是 mysql 的最佳选择。其他数据库有更多选择,例如 Postgresql 中的distinct on
或使用窗口函数(在许多数据库中)。
【参考方案1】:
不要创建临时表,而是在子查询中获取最小值,并在外部查询中加入主表:
SELECT A.cust_id
, A.date
, A.information
FROM dataset A
INNER JOIN (SELECT cust_id
, MIN(date) as mindate
FROM dataset
GROUP BY cust_id
) B ON A.cust_id = B.cust_id AND A.date = B.mindate
【讨论】:
我也使用子查询。我只是认为我一直在使用子查询/临时表以一种过于复杂的方式做事(两者的逻辑思想基本相同)。感谢大家的回答,我现在可以停止思考了:)。 在子查询的情况下,MySQL 可能会或可能不会创建临时表,因此它有更多选项。然而,在 MySQL 中还有另一种方法可以做到这一点,它依赖于非标准的group by
子句、MySQL 的特定配置设置,以及可能在没有任何通知的情况下更改的未记录的实现细节,所以我不鼓励你下去那条路线。以上是关于获取与聚合相关的回线,例如分钟的主要内容,如果未能解决你的问题,请参考以下文章