如何联接2个表,但仅从要联接的表之一中获取最大值?

时间:2019-06-14 18:51:51

标签: sql sql-server join

我试图在2个表上执行联接,而仅从与之联接的表的某一列中获取最大值。我正在MSSQL中做到这一点。

到目前为止,我有以下无法正常运行的语句:

select 
u.Id, u.Date, p.Purchase_Date, p.Return_Date, p.Grade 
from Users u 
inner join (select _p.Id, _p.Purchase_Date, _p.Return_Date, max(_p.Sequence), _p.Grade from Purchases _p group by _p.Id, _p.Purchase_Date, _p.Return_Date, _p.Grade) p 
on (p.Id = u.Id) and u.Date between p.Purchase_Date and p.Return_Date

用户表:

Id        Date
--------------------
1        2018-10-29
2        2018-10-30
3        2018-03-23

购买表:

Id     Purchase_Date     Return_Date     Sequence     Grade
-----------------------------------------------------------------
1       2018-10-29        2018-11-02        3          88
1       2017-08-05        2017-09-02        1          91
1       2017-09-08        2017-10-11        2          35
2       2018-09-09        2018-11-11        2          68
2       2018-05-06        2018-08-15        1          70
3       2018-01-10        2018-01-30        1          55 
3       2018-02-28        2018-03-28        2          83

我希望我的结果如下所示:

Id          Date        Purchase_Date       Return_Date       Grade    
--------------------------------------------------------------------
1        2018-10-29      2018-10-29          2018-11-02        88 
2        2018-10-30      2018-09-09          2018-11-11        68
3        2018-03-23      2018-02-28          2018-03-28        83

查询当前没有从“序列”列正确返回最大值,并且我得到了重复记录,这是我不想要的。我怀疑我没有正确使用max运算符,否则我可能会以其他方式加入它

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用apply

select u.*, p.*
from users u cross apply
     (select top (1) p.*
      from purchases p
      where p.Id = u.Id and
            u.Date between p.Purchase_Date and p.Return_Date
      order by p.Purchase_Date desc
     ) p;