2014-10-31 49 views
0

我试图在条件满足时找到第一个日期。因此,逻辑是如下:满足某些条件时的第一个日期

use 
[AdventureWorksDW2012] 
go 

;WITH sales AS (

select  d.OrderDateKey, 
     SalesAmount = SUM(d.SalesAmount) 
from  [dbo].[FactInternetSales] d 
group by d.OrderDateKey 
having  SUM(d.SalesAmount)>10000 
) 

select FirstOrderDateKey = MIN(OrderDateKey) 

from sales 

唯一的问题是,在我的数据是过于复杂和庞大,为每个日期计算的值,然后选择当条件满足时敏时间。当互联网销售额超过10000时,有没有快速找到第一次约会的方法?是否需要某种循环?

+1

你确定它是“过于复杂和巨大的”?无论您拥有的数据量如何,它都应该运行得非常快。确保你的表有索引。 – 2014-10-31 16:08:46

+0

通常,在SQL上下文中循环的想法是错位的。代之以集合来考虑。 – J0e3gan 2014-10-31 16:11:19

回答

2

你也可以在单个语句中完成。如果您在orderdatekey上有适当的索引,则可以使用此功能提高性能。

select  MIN(s.OrderDateKey) as FirstOrderDateKey 
from  [dbo].[FactInternetSales] d 
group by d.OrderDateKey 
having  SUM(d.SalesAmount)>10000 
0
SELECT TOP 1 
     d.OrderDateKey 
     ,S.RunningTotal 
FROM [dbo].[FactInternetSales] d 
      CROSS APPLY (SELECT SUM(SalesAmount) AS RunningTotal 
          FROM [dbo].[FactInternetSales] 
          WHERE OrderDateKey <= d.OrderDateKey 
         ) S 
WHERE S.RunningTotal < -- Condition 
ORDER BY d.OrderDateKey DESC 
+1

干杯@MikaelEriksson :) – 2014-10-31 18:11:15

+0

这实际上是我正在寻找诚实...因为它看起来在运行总数。我只是想知道是否有更好的方法,即获得更好的表现的方式? (也许是什么东西,而不是十字应用?) – BlueSkies 2014-11-10 17:32:49

+0

更改为CTE使其更快,但仍不确定这是否是最好的方法?动态SQL呢? – BlueSkies 2014-11-10 17:37:14

相关问题