【问题标题】:SQL: Return only the most recent activity per customerSQL:仅返回每个客户最近的活动
【发布时间】:2015-08-08 12:15:32
【问题描述】:

我有两个包含链接数据的表。有针对单个客户 (customer_id) 的活动更新。我想返回每位客户最近的活动;

联系; customer_id(自动增量) 姓 名字
电话工作

活动; activity_id (auto_increment) data_item_id 输入者 创建日期 笔记

我可以返回整个活动集;

SELECT last_name, first_name, date_created, notes, FROM contact JOIN activity ON contact.customer_id=activity.data_item_id;

..但我只想要每个 customer_name 的最新活动。如果我使用唯一的,它似乎返回每个 customer_name 的第一个活动,而不是最近的活动。我敢肯定它非常简单,但我还没有找到它。想法?

【问题讨论】:

  • 只是猜测...尝试添加另一列:SELECT MAX(entered_by date_created), last_name, ...。那应该从第二个表中选择正确的行。
  • 谢谢marki,做了更多的工作,看起来当然不错(!)使用max(date_created); SELECT last_name, first_name, max(date_created) AS date, notes, FROM contact JOIN activity ON contact.customer_id=activity.data_item_id ORDER BY customer_id ASC;
  • 您需要确认 note 列来自同一行(最近的活动) - 这对我来说使用 MAX() 没有 GROUP BY...看起来有点奇怪...

标签: mysql sql-order-by distinct


【解决方案1】:

您可以使用MAX(date_created) 从连接表中选择正确的行。否则 MySQL 将连接所有行,或者在 GROUP BY 的情况下,选择它找到的第一个匹配行。

所以查询将是:

SELECT MAX(date_created) AS date, last_name, first_name, notes
       FROM contact JOIN activity ON contact.customer_id=activity.data_item_id
       ORDER BY customer_id ASC

【讨论】:

    【解决方案2】:

    WITH TempTbl AS ( SELECT MAX(activity_id) activity_id --as it is auto_increment, this should return the most recent record) ,Last_Name ,First_Name ,Date_Created ,Notes FROM Activity JOIN Contact ON Contact.Customer_Id=Activity.Data_Item_Id ) SELECT * FROM TempTbl

    如果每个客户仍有多条记录,那么建议考虑使用 RANK()OVER(PARTITION BY... 来选择最近的记录

    【讨论】:

      【解决方案3】:

      另一种解决方案:

       select temp.* from
       ( 
        SELECT c.last_name last, c.first_name first, a.date_created, a.notes 
        FROM contact c JOIN activity a ON c.customer_id=a.data_item_id
        order by a.date_created desc
       ) temp
       group by temp.last, temp.first;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 2019-05-11
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        相关资源
        最近更新 更多