SQL查询MIN MAX

时间:2015-03-05 12:50:28

标签: sql sql-server database

我需要在SQL Server中编写一个连接两个表的查询:

让我们说我的第一张桌子是TB1:

Id     Date       ProductId
1111   1-Jan-08   345
1112   5-Apr-10   345
1113   1-Jan-13   345
1114   1-Oct-14   345
1115   1-Jan-15   345

第二表是TB2:

Id2  Date       ProductId   CompanyId  Flag
1    1-Jan-14   345         12         1
2    2-Jan-14   345         13         1
3    4-Jan-14   345         14         1
4    12-Nov-14  345         15         1

结果应为:

Id    ProductId   CompanyId
1111  345         12
1112  345         12
1113  345         12
1114  345         14
1115  345         15

即,TB1.Date< TB2.Date中的所有条目 - >然后应该选择与TB2中的最小日期相对应的CompanyID。

当TB1.Date> Tb2.Date中的所有条目 - >然后应该在TB2中采用CompanyId最大日期

当Tb1.Date介于TB2的日期之间时,应选择日期下方的CompanyId。

谢谢!

1 个答案:

答案 0 :(得分:0)

这应该有用,但还没有对它进行过广泛的测试。你可以尝试这个,并在你认为必要的地方修改/优化它。

此代码检查以下

  • 如果TB1中当前记录的日期小于min(所有日期) 对于TB2中的相应产品。如果是这样,则返回min(date) 相应的公司ID(第一个条件)
  • 如果TB1中当前记录的日期大于TB2中相应产品的最大值(所有日期)。如果是这样,max(date)是 返回并返回相应的公司ID(第二个条件)
  • 如果当前记录的日期介于相应产品的第二个表的日期范围之间,则会拉出最大日期 记录小于我们所指的TB1中的日期。

如果有帮助,请告诉我们

With daterange
as 
(Select ProductID, max(Date) as maxdate, min(Date) as mindate
from TB2
Group by ProductID)

Select distinct a.ProductId, a.Date as TB1Date, 
Case when a.Date < c.mindate then c.mindate 
     when a.Date > c.maxdate then c.maxdate 
     when a.Date between c.mindate and c.maxdate then (Select top 1 a1.Date     from TB2 a1 where a1.Date < a.Date and a1.ProductId = a.ProductId order by date desc) End as TB2Date,
 d.CompanyId as CompanyId 
FROM TB1 a 
Left join daterange c on a.ProductId = c.ProductId 
Left join TB2 d on (Case when a.Date < c.mindate then c.mindate 
     when a.Date > c.maxdate then c.maxdate 
     when a.Date between c.mindate and c.maxdate then (Select top 1 a1.Date     from TB2 a1 where a1.Date < a.Date and a1.ProductId = a.ProductId order by     date desc) End) = d.Date