У меня есть список операций с акциями, и я использую Over (Partition By) для расчета промежуточных итогов (позиций) по ценным бумагам. Со временем удержание в конкретной ценной бумаге может быть длинным, коротким или плоским. Я пытаюсь найти эффективный способ извлечь только транзакции, относящиеся к текущей позиции для каждой ценной бумаги.
Я создал упрощенный sqlfiddle , чтобы показать, что у меня есть до сих пор. Запрос cte генерирует промежуточный итог для каждой ценной бумаги (code_id) и определяет, когда авуары являются длинными (L), короткими (s) или плоскими (f). Что мне нужно, так это сгруппировать и сопоставить номера смежных значений L, S или F для каждого code_id.
На данный момент у меня есть следующее:
; WITH RunningTotals as
(
SELECT
*,
RunningTotal = sum(qty) OVER (Partition By code_id Order By id)
FROM
TradeData
), LongShortFlat as
(
SELECT
*,
LSF = CASE
WHEN RunningTotal > 0 THEN 'L'
WHEN RunningTotal < 0 THEN 'S'
ELSE 'F'
END
FROM
RunningTotals
)
SELECT
*
FROM
LongShortFlat r
Я думаю, что мне нужно сделать, это создать столбец GroupNum путем применения row_number для каждой группы L, S и F в каждом code_id, чтобы результаты выглядели так:
id code_id qty RunningTotal LSF GroupNum
1 1 5 5 L 1
2 1 2 7 L 1
3 1 7 14 L 1
4 1 -3 11 L 1
5 1 -5 6 L 1
6 1 -6 0 F 2
7 1 5 5 L 3
8 1 5 10 L 3
9 1 -2 8 L 3
10 1 -4 4 L 3
11 2 5 5 L 1
12 2 3 8 L 1
13 2 -4 4 L 1
14 2 -2 2 L 1
15 2 -2 0 F 2
16 2 6 6 L 3
17 2 -5 1 L 3
18 2 -5 -4 S 4
19 2 2 -2 S 4
20 2 4 2 L 5
21 2 -5 -3 S 6
22 2 -2 -5 S 6
23 3 5 5 L 1
24 3 2 7 L 1
25 3 1 8 L 1
Я изо всех сил пытаюсь создать столбец GroupNum.
Заранее спасибо за помощь.