Tsql 确定价格趋势
我有一张三列的桌子 +---------------+-------------------------+-------+ | InstrumentId | Date | Price | +---------------+-------------------------+-------+ | 39 | 2012-10-31 00:00:00.000 | 150 | | 39 | 2012-11-01 00:00:00.000 | 160 | | 39 | 2012-11-01 00:00:00.000 | 200 | | 40 | 2012-10-31 00:00:00.000 | 150 | | 40 | 2012-11-01 00:00:00.000 | 140 | | 40 | 2012-11-01 00:00:00.000 | 200 | | 50 | 2012-10-31 00:00:00.000 | 150 | | 50 | 2012-11-01 00:00:00.000 | 150 | | 50 | 2012-11-01 00:00:00.000 | 150 | +---------------+-------------------------+-------+Tsql 确定价格趋势,tsql,grouping,Tsql,Grouping,我有一张三列的桌子 +---------------+-------------------------+-------+ | InstrumentId | Date | Price | +---------------+-------------------------+-------+ | 39 | 2012-10-31 00:00:00.000 | 150 | | 39 | 2012-11-01 00:
让我知道这是否可行。我猜你的表中永远不会有一个price=-1,我认为这会给当前的解决方案带来问题
WITH CTE
AS ( SELECT RN = ROW_NUMBER() OVER ( ORDER BY instrumentId ) ,
*
FROM @table
)
SELECT CASE WHEN MIN(X.xPrice) = -1 THEN 0
ELSE MAX(X.xPrice)
END 'price' ,
X.instrumentId
FROM ( SELECT CASE WHEN [Current Row].instrumentId = [Next Row].instrumentId
THEN CASE WHEN [Current Row].price > [Next Row].price
THEN -1
ELSE [Current Row].price
END
ELSE CASE WHEN [Previous Row].instrumentId = [Current Row].instrumentId
THEN CASE WHEN [Previous Row].price <= [Current Row].price
THEN [Current Row].price
ELSE -1
END
ELSE [Current Row].price
END
END 'xPrice' ,
[Current Row].RN ,
[Current Row].instrumentId
FROM CTE [Current Row]
LEFT JOIN CTE [Previous Row] ON [Previous Row].RN = [Current Row].RN
- 1
LEFT JOIN CTE [Next Row] ON [Next Row].RN = [Current Row].RN
+ 1
) X
GROUP BY X.instrumentId
这似乎有点复杂,但基本思想是确定当前on的下一行和上一行,以便测试该行的价格列的值。请告诉我这是否可行。我猜你的表中永远不会有一个price=-1,我认为这会给当前的解决方案带来问题
WITH CTE
AS ( SELECT RN = ROW_NUMBER() OVER ( ORDER BY instrumentId ) ,
*
FROM @table
)
SELECT CASE WHEN MIN(X.xPrice) = -1 THEN 0
ELSE MAX(X.xPrice)
END 'price' ,
X.instrumentId
FROM ( SELECT CASE WHEN [Current Row].instrumentId = [Next Row].instrumentId
THEN CASE WHEN [Current Row].price > [Next Row].price
THEN -1
ELSE [Current Row].price
END
ELSE CASE WHEN [Previous Row].instrumentId = [Current Row].instrumentId
THEN CASE WHEN [Previous Row].price <= [Current Row].price
THEN [Current Row].price
ELSE -1
END
ELSE [Current Row].price
END
END 'xPrice' ,
[Current Row].RN ,
[Current Row].instrumentId
FROM CTE [Current Row]
LEFT JOIN CTE [Previous Row] ON [Previous Row].RN = [Current Row].RN
- 1
LEFT JOIN CTE [Next Row] ON [Next Row].RN = [Current Row].RN
+ 1
) X
GROUP BY X.instrumentId
它可能看起来有点复杂,但基本思想是确定当前on的下一行和上一行,以便测试该行的price列的值
WITH CTE
AS ( SELECT RN = ROW_NUMBER() OVER ( ORDER BY instrumentId ) ,
*
FROM @table
)
SELECT CASE WHEN MIN(X.xPrice) = -1 THEN 0
ELSE MAX(X.xPrice)
END 'price' ,
X.instrumentId
FROM ( SELECT CASE WHEN [Current Row].instrumentId = [Next Row].instrumentId
THEN CASE WHEN [Current Row].price > [Next Row].price
THEN -1
ELSE [Current Row].price
END
ELSE CASE WHEN [Previous Row].instrumentId = [Current Row].instrumentId
THEN CASE WHEN [Previous Row].price <= [Current Row].price
THEN [Current Row].price
ELSE -1
END
ELSE [Current Row].price
END
END 'xPrice' ,
[Current Row].RN ,
[Current Row].instrumentId
FROM CTE [Current Row]
LEFT JOIN CTE [Previous Row] ON [Previous Row].RN = [Current Row].RN
- 1
LEFT JOIN CTE [Next Row] ON [Next Row].RN = [Current Row].RN
+ 1
) X
GROUP BY X.instrumentId