需要帮助创建SQL查询到最新数据

时间:2014-05-06 02:40:28

标签: sql sql-server

我有一个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

非常感谢任何帮助。

3 个答案:

答案 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。然后,表格本身已与productfounddate上的结果集相结合,该结果集用于为结果中的每个sub_productproduct选择founddate内部查询。