Tsql 确定价格趋势

Tsql 确定价格趋势,tsql,grouping,Tsql,Grouping,我有一张三列的桌子 +---------------+-------------------------+-------+ | InstrumentId | Date | Price | +---------------+-------------------------+-------+ | 39 | 2012-10-31 00:00:00.000 | 150 | | 39 | 2012-11-01 00:

我有一张三列的桌子

+---------------+-------------------------+-------+ | 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 | +---------------+-------------------------+-------+
让我知道这是否可行。我猜你的表中永远不会有一个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