这是我在这个论坛的第一篇文章,所以请理解。
我有以下问题。
我想两个人加入两个表:
表1:
Product | Start Date | End Date
-------------------------------------
Product1 | 01/01/2014 | 01/05/2015
Product2 | 01/03/2014 | 01/01/2015
表2:
Product | Start Date | End Date | Value
--------------------------------------------
Product1 | 01/01/2014 | 01/02/2015 | 10
Product1 | 02/02/2014 | 01/04/2015 | 15
Product1 | 02/04/2014 | 01/05/2015 | 15
Product2 | 01/03/2014 | 04/05/2014 | 5
Product2 | 05/05/2014 | 01/01/2015 | 5
要有一个具有最新值的表格,如:
Product | Start Date | End Date | Value
------------------------------------------------
Product1 | 02/04/2014 | 01/05/2015 | 15
Product2 | 05/05/2014 | 01/01/2015 | 5
我需要加入它们而不是只使用第二个表,因为它们都有我需要使用的更多唯一列。
我在考虑首先在第二个表上使用某种IF函数来为每个产品创建一行(具有最新开始日期的那一行),然后再将其与第一个表一起加入。但我不知道如何做第一部分。
我真的很期待你的帮助。
此致 马特
答案 0 :(得分:1)
只使用WHERE NOT EXISTS过滤除TABLE2中的最新日期之外的所有日期(我假设您要求TABLE2中的最新STARTDATE;我也将'SomeOtherField'添加到Table1,因为否则您只能查询Table2) :
SELECT t1.Product,t1.SomeOtherField,t2.StartDate,t2.EndDate,t2.Value
FROM Table1 t1
JOIN(选择a.Product,a.StartDate,a.EndDate,a.Value FROM Table2 a
不存在(SELECT * FROM Table2 b
WHERE b.Product = a.Product AND b.StartDate> a.StartDate))t2
ON(t2.Product = t1.Product)
答案 1 :(得分:0)
这是可能的,查询将涉及三个步骤:
start date
的所有最大product
。提示:使用group by。Value
。答案 2 :(得分:0)
您的示例中根本不确定是否需要Table1
,您只需要汇总Table2
以查找每个MAX([Start Date]
的{{1}}:
Product
如果您确实需要从SELECT a.*
FROM Table2 a
JOIN (SELECT Product,MAX([Start Date]) AS Mx_Start_Dt
FROM Table2
GROUP BY Product
) b
ON a.Product = b.Product
AND a.[Start Date] = b.Mx_Start_Dt
引入字段,则可以添加另一个Table
:
JOIN
如果使用支持分析功能的数据库,可以通过SELECT a.*,b.*
FROM Table1 a
JOIN (SELECT a.*
FROM Table2 a
JOIN (SELECT Product,MAX([Start Date]) AS Mx_Start_Dt
FROM Table2
GROUP BY Product
) b
ON a.Product = b.Product
AND a.[Start Date] = b.Mx_Start_Dt
) c
ON a.Product = b.Product
功能使其更清晰:
ROW_NUMBER()
答案 3 :(得分:0)
以下是在SQLServer中使用ROW_NUMBER
的解决方案:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY Product ORDER BY StartDate DESC) RN
FROM @T
) Results
WHERE RN = 1