/*
表结构数据如下:
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
SQL分组问题
猜你喜欢
转载自blog.csdn.net/mxbing1984/article/details/82555510
今日推荐
周排行