我有两个表,Sales
和SalesNotes
,如下所示
Sales
SO No......Cust.........Date
1..........Me..........22-04-13
2..........You.........23-04-13
SalesNotes
SO No.......Note.......Notedate
1...........Blah.......24-04-13
2...........Bleh.......23-04-13
2...........Bluh.......27-04-13
如何返回显示相应SO号的Cust,日期和最近日期注释的结果集?
我尝试过使用MAX()
但不能在where子句中使用聚合,并且不明白如何实现HAVING来做我需要的。
我想要实现的目标是:
SO No.......Cust........Note
1...........Me..........Blah
2...........You.........Bluh
答案 0 :(得分:2)
执行此操作的一种方法是使用row_number
窗口函数:
SELECT s.[So no], [cust], [Note]
FROM [Sales] s
LEFT JOIN (SELECT [So no], [Note],
ROW_NUMBER() OVER (PARTITION BY [So no]
ORDER BY [Notedate] DESC) rn
FROM [SalesNotes]) n ON s.[So no] = n.[So no] AND rn = 1
答案 1 :(得分:1)
您可以使用outer apply
:
select s.*, sn.note
from sales s outer apply
(select top 1 sn.*
from salesnotes sn
where sn.so_no = s.so_no
order by sn.notedate desc
) sn;
答案 2 :(得分:1)
您可以使用窗口函数FIRST_VALUE
获取每Note
的最新[SO No.]
值:
SELECT s.[SO No.], Cust, Note
FROM Sales AS s
INNER JOIN (SELECT DISTINCT [SO No.],
FIRST_VALUE(Note) OVER (PARTITION BY [SO No.]
ORDER BY NoteDate DESC) AS Note
FROM SalesNotes) AS sn
ON s.[SO No.] = sn.[SO No.]
这样就可以避免使用相关的子查询,我认为这种子查询性能较差。
FIRST_VALUE
可从SQL Server 2012+获得。
答案 3 :(得分:0)
我将您的输出理解为上次销售和该销售的最后一个注释。如果您要对所有销售执行此操作,请先删除Top 1
。您可以使用Apply
执行此操作:
Select Top 1 s.SoNo, s.Cust, oa.Note
From Sales s
Outer Apply (Select Top 1 Note From Notes n Where n.SoNo = s.SoNo Order By Date Desc) oa
Order By s.Date desc
答案 4 :(得分:0)
这样的事情:
select s.so_no, s.cust,
(select top (1) n.note from salesnotes n where s.so_no = n.so_no order by notedate desc) as note
from sales s
答案 5 :(得分:0)
因为你在谈论' max'在where子句中,这只是为了让你理解' max' 。而且你知道这不是一个好的解决方案,因为有很多问题,例如,如果两个不同的客户的注释是相同的,如果客户具有相同的名称,等等等等。您应该遵循外部应用概念,正如其他人为正确的解决方案所建议的那样。
Select s.SoNo, s.cust, sn.notes, max(sn.noteDate) from sales s inner join salesnotes sn on s.sono=sn.sono group by s.sono,s.cust,sn.notes