代码之家  ›  专栏  ›  技术社区  ›  m-albert

Stumped on a complex GROUP BY[duplicate]

  •  0
  • m-albert  · 技术社区  · 2 年前

    给定以下查询,如何按分组 con_num 并检索 lead_id 使用MAX date_entered ? 我使用的是SQL Server 2012。

    SELECT leads.id AS lead_id 
        , leads.date_entered 
        , so.con_num 
        , so.ord_date 
    FROM crm.leads 
        INNER JOIN crm.contacts ON leads.contact_id = contacts.id 
        INNER JOIN crm.email_addr_bean_rel rel ON rel.bean_id = contacts.id 
        INNER JOIN crm.email_addresses email ON email.id = rel.email_address_id 
        INNER JOIN sales_order so ON so.bill_email = email.email_address OR so.dt_email = email.email_address 
    WHERE rel.bean_module = 'contacts' AND so.ord_date >= leads.date_entered
    

    例如,当前查询(部分)返回以下两行。。。

    引线_id 以日期为中心 con_num 订单日期
    1. 2021-04-20 N0226091 2021-04-22
    2. 2021-04-21 N0226091 2021-04-22

    查询应每个返回一行 con_num 包含最新的 引线_id 连同它 entered_date ...

    引线_id 以日期为中心 con_num 订单日期
    2. 2021-04-21 N0226091 2021-04-22

    非常感谢。

    1 回复  |  直到 2 年前
        1
  •  1
  •   jarlh    2 年前

    使用 ROW_NUMBER() window函数来获取每个so.con_num的最新lead_id/date_entered行。

    select lead_id, date_entered, con_num, ord_date
    from
    (
        SELECT leads.id AS lead_id 
            , leads.date_entered 
            , so.con_num 
            , so.ord_date
            , row_number() over (partition by so.con_num
                                 order by leads.id desc, leads.date_entered desc) rn
        FROM crm.leads 
            INNER JOIN crm.contacts ON leads.contact_id = contacts.id 
            INNER JOIN crm.email_addr_bean_rel rel ON rel.bean_id = contacts.id 
            INNER JOIN crm.email_addresses email ON email.id = rel.email_address_id 
            INNER JOIN sales_order so ON so.bill_email = email.email_address OR so.dt_email = email.email_address 
        WHERE rel.bean_module = 'contacts' AND so.ord_date >= leads.date_entered
    ) dt
    where rn = 1