2016-06-14 82 views
1

我写这样的方式下面的查询返回的数据,我需要:分组和排序结果挑最近的记录在MS SQL

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 = '[email protected]' 
AND SLST.[Status] IS NULL 
ORDER BY SOR.DocumentDate DESC 

唯一的问题是,这封邮件我使用在这里过滤器产生这样的多个结果(虽然是正确的):

enter image description here

如何使用group by去除重复行,所以我只能得到一个记录最近DocumentDate?

我知道我可以做TOP 1但这不是我所需要的。因为,我正在通过对具有重复的特定电子邮件进行作用域测试来测试查询。后来,我需要在没有此行的所有记录上运行此查询AND SLCD.DefaultEmail = '[email protected]' - 因此您可以看到为什么我无法使用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 = '[email protected]' 
AND SLST.[Status] IS NULL 
GROUP BY SLCD.DefaultEmail 
ORDER BY MAX(SOR.DocumentDate) DESC 

它返回错误的结果:

enter image description here

我期待它返回该记录:

enter image description here

任何想法我可能在这里做错了吗?

回答

2

使用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; 
+0

感谢这个,我想它是这样的:http://pastebin.com/GCssEkpC它仍然返回错误的结果如上图所示。但是,如果我删除'group by'子句,它将返回2条记录(对于customeraccountnumber的每个变体)。我做错了吗? – Latheesan

+0

@Latheesan你必须从你的问题的一开始就进行查询,并用'q作为()...'粘贴。从您的输出5行将显示只有两个在最近的日期。 – gofr1

+0

我试过了,它确实显示**两个像这样的记录:http://i.imgur.com/hAWlUqY.png - 这不是我所需要的。每个电子邮件需要一个结果,按照最近的'DocumentDate'排序,因此我应该根据我的原始问题得到customeraccountnumber'JAC006'的结果。即我试图使用'order by'和'_email_组'。 – Latheesan