我有一个MS SQL Server Express 2012表,不断填充数据,让我们知道哪些产品可用。每个产品下都有一个或多个子产品。当更新产品的过程进行更新时,它还会同时更新所有子产品。 (因此它们将具有相同的创建日期戳,因为它们是在同一次运行中找到的)因为这些数据不断被添加到表中,所以只有最新的数据很重要。我们不想删除旧数据,因为它用于其他目的,但我需要帮助创建一个声明,以帮助我只查看每个产品(包括子产品)的最新数据。挑战是我们有成千上万的产品和子产品他们都会有不同的“最近发现”时代。
这个sql小提琴是我数据的简化版本:http://sqlfiddle.com/#!3/0531b/1
我想帮助创建一个只返回每个产品的最新finddate(和相应数据)的查询。我希望这个查询的结果(使用小提琴中的数据集)看起来像这样:
product sub_product founddate
1 1 5/3/2014
1 2 5/3/2014
2 7 5/4/2014
2 8 5/4/2014
2 9 5/4/2014
3 10 4/15/2014
非常感谢任何帮助。
答案 0 :(得分:1)
执行此操作的最有效方法可能是使用not exists
子句:
select *
from project_data pd
where not exists (select 1
from project_data pd2
where pd2.product = pd.product and
pd2.founddate > pd.founddate
);
逻辑是:“从同一产品没有更大日期的project_data
获取所有行。”对于project_data(product, founddate)
上的索引,这将表现最佳。
答案 1 :(得分:0)
以下是使用Max
将表格连接到自身的另一种选择:
select pd.product, pd.sub_product, pd.founddate
from project_data pd
join (select product, max(founddate) maxdt
from project_data
group by product
) t on pd.product = t.product and pd.founddate = t.maxdt
答案 2 :(得分:0)
试试这个:
SELECT T2.product,T1.sub_product,T2.founddate
FROM project_data T1 INNER JOIN
(
select product,CONVERT(VARCHAR(10), CONVERT(datetime, max(founddate), 1), 101)as founddate
from project_data
GROUP BY product
) T2 ON T1.founddate=T2.founddate AND T1.product=T2.product
ORDER BY T2.product,T1.sub_product
结果:
PRODUCT SUB_PRODUCT FOUNDDATE
1 1 05/03/2014
1 2 05/03/2014
2 7 05/04/2014
2 8 05/04/2014
2 9 05/04/2014
3 10 04/15/2014
请参阅SQL Fiddle中的结果。
<强>解释强>
每个产品的内部查询选择product
和最大founddate
。然后,表格本身已与product
和founddate
上的结果集相结合,该结果集用于为结果中的每个sub_product
和product
选择founddate
内部查询。