2017-08-14 158 views
2

我的總行數是可變的,並且不是固定的,所以有N行,我想將每5行分成一組,並在SQL中的下表中選擇價格的最大值。在每5行中選擇最大值

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 
2017

所以在第一組5最高價格是110,而第二組是100,而最後一組最高價格是120

回答

1

使用公用表表達式對它們進行分組。

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小提琴:http://sqlfiddle.com/#!6/b5857/3/0

+0

工作就像一個魅力,讓我知道是有可能有日期選定的價格還? – MahdiIBM

+0

像在類似:'20170101 - 20170109 110' – Matt

+0

不喜歡 - > 20170102 = 110 – MahdiIBM

1

你可以使用:

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-2017

Rextester Demo2

1

您可以使用ROW_NUMBER如下

;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)