获取与聚合相关的回线,例如分钟

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 的特定配置设置,以及可能在没有任何通知的情况下更改的未记录的实现细节,所以我不鼓励你下去那条路线。

以上是关于获取与聚合相关的回线,例如分钟的主要内容,如果未能解决你的问题,请参考以下文章

Django Max DateTime 聚合

SQL Server 获取构成聚合的第一行和最后一行

在 MySQL 中聚合/分组一组行/记录

DDD:我需要多少个聚合根?

聚合 + 最后 & 第一个 -> 丢失订单

LINQ 按时间段聚合和分组