2014-10-31 47 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

相關問題