SQL分组问题

/*
表结构数据如下:
Id  dDate        Price
1   2013-10-01  218
2   2013-10-02  218
3   2013-10-03  218
4   2013-10-04  238
5   2013-10-05  238
6   2013-10-06  238
7   2013-10-07  258
8   2013-10-08  258
9   2013-10-09  218

想获取的结果集:
2013-10-01至2013-10-03  218
2013-10-04至2013-10-06  238
2013-10-07至2013-10-08  258
2013-10-09至2013-10-09  218
*/

--1.建表
CREATE TABLE #Tmp
(
	Id  INT,
	dDate Date,
	Price INT 
)

--2.插入数据
INSERT INTO #Tmp  
SELECT 1, '2013-10-01', 218 UNION ALL 
SELECT 2,'2013-10-02',  218 UNION ALL 
SELECT 3,'2013-10-03',  218 UNION ALL 
SELECT 4,'2013-10-04',  238 UNION ALL 
SELECT 5,'2013-10-05',  238 UNION ALL 
SELECT 6,'2013-10-06',  238 UNION ALL 
SELECT 7,'2013-10-07',  258 UNION ALL 
SELECT 8,'2013-10-08',  258 UNION ALL 
SELECT 9,'2013-10-09',  218 

--3.1方法一
SELECT CONVERT(NVARCHAR(10),B.dDate,121)+'至'+ CONVERT(NVARCHAR(10),A.dDate,121),A.Price 
FROM 
(
	SELECT ROW_NUMBER() OVER(ORDER BY A.Id) AS X, A.* FROM #Tmp  A 
	LEFT JOIN #Tmp B ON A.Id=B.Id-1 AND A.Price=B.Price
	WHERE B.Id IS NULL 
) A INNER JOIN 
(
	SELECT ROW_NUMBER() OVER(ORDER BY A.Id) AS X,A.* FROM #Tmp  A 
	LEFT JOIN #Tmp B ON A.Id=B.Id+1 AND A.Price=B.Price
	WHERE B.Id IS NULL
) B ON  A.X=B.X 


--3.2方法二
SELECT CONVERT(NVARCHAR(10),MIN(dDate),121) + '至' +CONVERT(NVARCHAR(10), MAX(dDate),121) AS dDate,Price 
FROM (
	SELECT *,  
	ROW_NUMBER() OVER(PARTITION BY Price ORDER BY Id) AS Rownum,  
    MIN(Id) OVER(PARTITION BY Price) AS Min_Id  
		FROM #Tmp  
	) A
GROUP BY Price,Rownum - (Id - Min_Id)

--3.3方法三
SELECT *,0 AS T INTO #Tmp2 FROM #Tmp
DECLARE @I INT=0
DECLARE @Price INT
UPDate #Tmp2 SET T=@I,@I=@I+CASE WHEN @Price=Price THEN 0 ELSE 1 END,@Price=Price  
SELECT CONVERT(NVARCHAR(10),MIN(dDate),121) + '至' +CONVERT(NVARCHAR(10), MAX(dDate),121) AS dDate,MAX(Price) AS  Price
FROM #Tmp2 GROUP BY T

--4.删除表
DROP TABLE #Tmp
DROP TABLE #Tmp2

猜你喜欢

转载自blog.csdn.net/mxbing1984/article/details/82555510