2015-11-12 79 views
1
OrderUTC    Symbol TargetPosition 
2011-02-01 3:59:59.000 GBPUSD 1000000 
2011-02-01 13:59:59.000 GBPUSD 1000000 
2011-02-01 5:59:59.000 EURUSD 1000000 
2011-02-01 22:59:59.000 EURUSD 1000000 

我想通過符號中的最後TargetPosition - 我該怎麼辦呢?如何在GROUP BY中獲得TOP?

SELECT TOP(1) [Symbol],[TargetPosition] 
    FROM [FX].[dbo].[Orders] 
    GROUP BY [Symbol] 
    ORDER BY [OrderUTC] 

不起作用

列「FX.dbo.Orders.TargetPosition」,因爲它不是在聚合函數或 GROUP BY子句中包含的是在選擇列表 無效。要做到這一點

回答

2

一種方法是使用ROW_NUMBER,然後採取只是個1,是這樣的:

select Symbol,TargetPosition from (
    SELECT Symbol,TargetPosition, 
    row_number() over (partition by Symbol order by OrderUTC) as RN 
    FROM [FX].[dbo].[Orders] 
) X 
where RN = 1 
+0

我會認爲順序是desc。假設最新的「最後」。 – xQbert

+0

哇 - 它真的需要這個複雜的簡單的查詢嗎? – ManInMoon

+0

@xQbert是的,它可能需要按順序desc,但是OPs SQL也缺少它。 –

1

使用窗口函數,而不是獨立訂購每個符號的定價。

select * from 
    (select symbol, targetposition 
     , row_number() over (partition by symbol order by orderutc desc) as rn 
from fx.dbo.orders) as A where a.rn = 1 
0

你有幾個問題馬上蝙蝠。首先,TOP限制返回的記錄數量,它並不關心值。第二個GROUP意味着一個聚合函數將應用於所有使用的非分組列(TargetPosition和OrderUTC)。

現在,要做你想做的事,已經有幾個答案可以工作,所以我會給你稍微不同的答案。

SELECT 
    Symbol, 
    FIRST_VALUE(TargetPosition) OVER (PARTITION BY Symbol ORDER BY OrderUTC DESC) 
FROM 
    FX.dbo.Orders 
GROUP BY 
    Symbol 
+0

看起來可讀 - 但我似乎沒有FIRST_VALUE – ManInMoon

+0

@ManInMoon,FIRST_VALUE是否會拋出錯誤?如果我正確閱讀這個(https://msdn.microsoft.com/en-us/library/hh213018.aspx)它看起來像它適用於SQL Server 2012和以上,你使用2008?在SQL Server Management Studio中,FIRST_VALUE不像其他窗口函數那樣染成粉紅色,但它確實有效。 – hcaelxxam

+0

YEs 2008 - 它不承認它 – ManInMoon

0

我認爲與總行數相比,不同符號的數量非常小。而不是使用聚合,我會使用APPLY。這將只爲每個符號尋找一個。

我會創建一個包含所有可能符號(GBPUSD,EURUSD ...)的表格。讓我們把它叫做符號表,並嘗試這個辦法:

WITH Symbols AS 
(
    SELECT Symbol 
    FROM SymbolTable 
) 
SELECT S.Symbol, A1.TargetPosition 
FROM Symbols AS S 
CROSS APPLY (SELECT TOP (1) O.TargetPosition 
      FROM [FX].[dbo].[Orders] AS O 
      WHERE O.Symbol = S.Symbol 
      ORDER BY OrderUTC DESC 
      ) AS A1; 

但你需要一個索引(符號ASC,OrderUTC DESC,INCLUDE TargetPosition)。如果有很多不同的符號,使用窗口函數將比這個解決方案表現更好。

0

使用Over Partition by symbol是一個更好的解決方案。但是,對於不熟悉分析函數的人員來說,這可能會更容易理解。

在進行分析之前,在CTE之前,這是實現預期結果的常用方法。

獲取一組由最大日期的每個符號然後加入將結果返回到設定爲消除非當前符號和獲得具有最大日期的目標位置的基礎的數據。

因此,使用基於集合的處理,我們有一組符號和其最大的日期,我們加入該設置回整套消除沒有最大日期離開日期最大的象徵和targetPosition這些符號。

SELECT A.Symbol, A.TargetPosition 
FROM ORDERS A 
INNER JOIN (SELECT max(OrderUTC) mDate, symbol 
    FROM orders 
    GROUP BY Symbol) B 
on B.mDate = A.orderUTC 
and B.Symbol = A.Symbol