代码之家  ›  专栏  ›  技术社区  ›  MahdiIBM

每5行选择最大值

  •  2
  • MahdiIBM  · 技术社区  · 7 年前

    Date     Price
    20170101 100
    20170102 110
    20170103 90
    20170105 80
    20170109 76
    
    20170110 50
    20170111 55
    20170113 80
    20170115 100
    20170120 99
    
    20170121 88
    20170122 98
    20170123 120
    

    所以在前5组中,最大价格是110,第二组是100,最后一组最大价格是120。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Matt    7 年前

    使用公共表表达式对它们进行分组。

    WITH CTE AS (SELECT RANK() OVER (ORDER BY Date) AS Rank, Price
                 FROM yourtable)
    SELECT (Rank - 1) / 5 AS GroupedDate, MAX(Price) AS MAXPRICE
    FROM CTE
    GROUP BY ((Rank - 1) / 5);
    

    GroupedDate MAXPRICE
    0           110
    1           100
    2           120
    

    SQL Fiddle: http://sqlfiddle.com/#!6/b5857/3/0

        2
  •  1
  •   Kannan Kandasamy    7 年前

    ;With cte as (
    Select *, Bucket = Sum(RowN) over(Order by [date]) from (
        Select *, RowN = case when row_number()  over(order by [date]) % 5 = 0 then 1 else 0 end from #data1
    ) a
    ) Select top (1) with ties [Date], [Price]
    from cte 
    order by row_number() over (partition by Bucket order by Price desc)
    
        3
  •  1
  •   Lukasz Szozda    7 年前

    您可以使用:

    SELECT grp, MAX(Price) AS price
    FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY DATE)  / 5 AS grp FROM tab) sub
    GROUP BY grp;
    
    -- OUTPUT
    grp  price
    0    110
    1    100
    2    120
    

    Rextester Demo

    例如:20170101-20170109 110

    SELECT 
       CONVERT(VARCHAR(8),MIN(DATE),112) + '-' + CONVERT(VARCHAR(8),MAX(date),112)
         , MAX(Price) AS price
    FROM (SELECT *, (ROW_NUMBER() OVER(ORDER BY DATE) ) / 5 AS grp FROM tab) sub
    GROUP BY grp;
    

    输出:

    20170101-20170105   110
    20170109-20170115   100
    20170120-20170123   120
    

    Rextester Demo2