【问题标题】:Grouping and Ordering result to pick the most recent record in MS SQL分组和排序结果以选择 MS SQL 中的最新记录
【发布时间】:2016-06-14 12:54:39
【问题描述】:

我有以下查询,它返回我需要的数据:

SELECT SLCA.CustomerAccountNumber, SLCD.DefaultEmail, SOR.DocumentDate, SLST.*
FROM SLCustomerAccount AS SLCA
INNER JOIN SOPOrderReturn AS SOR ON SOR.CustomerID = SLCA.SLCustomerAccountID
INNER JOIN SLCustomerContactDefaultsVw AS SLCD ON SLCD.SLCustomerAccountID = SLCA.SLCustomerAccountID
LEFT OUTER JOIN MMS182SLStatus AS SLST ON SLST.Customer = SLCA.SLCustomerAccountID
WHERE SLCD.IsDefaultRole = 1 AND SLCD.DefaultEmail IS NOT NULL AND SLCD.DefaultEmail <> ''
 AND SLCD.DefaultEmail = '...major@live.co.uk'
 AND SLST.[Status] IS NULL
ORDER BY SOR.DocumentDate DESC

唯一的问题是,我在 where 过滤器中使用的这封电子邮件会产生多个这样的结果(尽管是正确的):

如何使用group by 删除重复的行,这样我只能得到最近 DocumentDate 的一条记录?

我知道我可以做到TOP 1,但这不是我需要的。因为,我现在通过将范围限定为具有重复的特定电子邮件来测试查询。稍后,我需要对所有没有这行 AND SLCD.DefaultEmail = '...major@live.co.uk' 的记录运行此查询 - 这样您就可以看到为什么我不能使用 TOP 1

当我尝试像这样使用group by 时:

SELECT MAX(SLCA.CustomerAccountNumber), MAX(SLCD.DefaultEmail), MAX(SOR.DocumentDate), MAX(SLST.MMS182SLStatus), MAX(SLST.Customer), MAX(SLST.[Status])
FROM SLCustomerAccount AS SLCA
INNER JOIN SOPOrderReturn AS SOR ON SOR.CustomerID = SLCA.SLCustomerAccountID
INNER JOIN SLCustomerContactDefaultsVw AS SLCD ON SLCD.SLCustomerAccountID = SLCA.SLCustomerAccountID
LEFT OUTER JOIN MMS182SLStatus AS SLST ON SLST.Customer = SLCA.SLCustomerAccountID
WHERE SLCD.IsDefaultRole = 1 AND SLCD.DefaultEmail IS NOT NULL AND SLCD.DefaultEmail <> ''
 AND SLCD.DefaultEmail = '...major@live.co.uk'
 AND SLST.[Status] IS NULL
GROUP BY SLCD.DefaultEmail
ORDER BY MAX(SOR.DocumentDate) DESC

返回错误的结果:

我期待它返回这条记录:

有什么想法我在这里可能做错了吗?

【问题讨论】:

    标签: sql sql-server group-by relational-database sql-order-by


    【解决方案1】:

    使用row_number():

    with q as (<your query here without the `order by`>)
    select q.*
    from (select q.*,
                 row_number() over (partition by DefaultEmail order by documentdate desc) as seqnum
          from q
         ) q
    where seqnum = 1;
    

    【讨论】:

    • 谢谢你,我试过这样:pastebin.com/GCssEkpC,它仍然返回错误的结果,如上所示。但是,如果我删除 group by 子句,它将返回 2 条记录(针对 customeraccountnumber 的每个变体)。我做错了吗?
    • @Latheesan 您必须从问题的最开始进行查询并粘贴到with q as (&lt;here&gt;)...。对于您的输出中的 5 行,在最近日期将仅显示两行。
    • 我试过了,它确实显示了 两个 记录,如下所示:i.imgur.com/hAWlUqY.png - 这不是我需要的。我需要每封电子邮件一个结果,按最近的DocumentDate 排序,因此根据我最初的问题,我应该得到客户帐号JAC006 的结果。即我正在尝试使用order by AND group by email
    • @Latheesan 在来自答案row_number() over (partition by DefaultEmail order by documentdate desc) as seqnum的查询中使用它
    • 太棒了!非常感谢 - 这成功了。我还用多封电子邮件对其进行了测试,它似乎按预期工作。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2014-02-13
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多