求SQL语句,接续重复的只要一笔记录

求SQL语句,连续重复的只要一笔记录
本帖最后由 wonderfuly 于 2014-03-27 23:59:07 编辑
求Attr1连续重复的只要一笔记录

CREATE TABLE [dbo].[ProductVersion](
[VersionNo] [varchar](10) NULL,
[ProductId] [varchar](10) NULL,
[ProductName] [varchar](30) NULL,
[Attr1] [varchar](10) NULL,
[Attr2] [varchar](10) NULL
)

INSERT INTO dbo.ProductVersion
          SELECT  '2014-03-01', 'F01', '衬衣', '01', '01'
UNION ALL SELECT  '2014-03-02', 'F01', '衬衣', '01', '03'
UNION ALL SELECT  '2014-03-03', 'F01', '衬衣', '02', '03'
UNION ALL SELECT  '2014-03-04', 'F01', '衬衣', '04', '03'
UNION ALL SELECT  '2014-03-05', 'F01', '衬衣', '05', '03'
UNION ALL SELECT  '2014-03-06', 'F01', '衬衣', '01', '02'
UNION ALL SELECT  '2014-03-07', 'F01', '衬衣', '01', '04'
UNION ALL SELECT  '2014-03-08', 'F01', '衬衣', '05', '04'
UNION ALL SELECT  '2014-03-09', 'F01', '衬衣', '01', '02'

最后结果为:
2014-03-01 F01 衬衣 01 01
2014-03-03 F01 衬衣 02 03
2014-03-04 F01 衬衣 04 03
2014-03-05 F01 衬衣 05 03
2014-03-06 F01 衬衣 01 02
2014-03-08 F01 衬衣 05 04
2014-03-09 F01 衬衣 01 02
目的查看商品Attr1变动历史。

2号、6号两天Attr1属性未变动所以要去掉。


------解决方案--------------------

DECLARE @ProductVersion TABLE (
[VersionNo] [varchar](10) NULL,
[ProductId] [varchar](10) NULL,
[ProductName] [varchar](30) NULL,
[Attr1] [varchar](10) NULL,
[Attr2] [varchar](10) NULL
)

INSERT INTO @ProductVersion
          SELECT  '2014-03-01', 'F01', '衬衣', '01', '01'
UNION ALL SELECT  '2014-03-02', 'F01', '衬衣', '01', '03'
UNION ALL SELECT  '2014-03-03', 'F01', '衬衣', '02', '03'
UNION ALL SELECT  '2014-03-04', 'F01', '衬衣', '04', '03'
UNION ALL SELECT  '2014-03-05', 'F01', '衬衣', '05', '03'
UNION ALL SELECT  '2014-03-06', 'F01', '衬衣', '01', '02'
UNION ALL SELECT  '2014-03-07', 'F01', '衬衣', '01', '04'
UNION ALL SELECT  '2014-03-08', 'F01', '衬衣', '05', '04'
UNION ALL SELECT  '2014-03-09', 'F01', '衬衣', '01', '02'

;WITH CTE_Version AS(
SELECT [VersionNo], [ProductId], [ProductName],[Attr1], [Attr2], ROW_NUMBER() OVER(ORDER BY CONVERT(Date,[VersionNo],120)) AS RN FROM @ProductVersion )

SELECT [VersionNo], [ProductId], [ProductName],[Attr1], [Attr2]
FROM CTE_Version V 
WHERE NOT EXISTS (SELECT * FROM CTE_Version WHERE RN = V.RN-1 AND Attr1 = V.Attr1 )
ORDER BY V.RN 


------解决方案--------------------
CREATE TABLE #ProductVersion(
[VersionNo] [varchar](10) NULL,
[ProductId] [varchar](10) NULL,
[ProductName] [varchar](30) NULL,
[Attr1] [varchar](10) NULL,
[Attr2] [varchar](10) NULL
)

INSERT INTO #ProductVersion
          SELECT  '2014-03-01', 'F01', '襯衣', '01', '01'
UNION ALL SELECT  '2014-03-02', 'F01', '襯衣', '01', '03'
UNION ALL SELECT  '2014-03-03', 'F01', '襯衣', '02', '03'
UNION ALL SELECT  '2014-03-04', 'F01', '襯衣', '04', '03'
UNION ALL SELECT  '2014-03-05', 'F01', '襯衣', '05', '03'
UNION ALL SELECT  '2014-03-06', 'F01', '襯衣', '01', '02'
UNION ALL SELECT  '2014-03-07', 'F01', '襯衣', '01', '04'
UNION ALL SELECT  '2014-03-08', 'F01', '襯衣', '05', '04'
UNION ALL SELECT  '2014-03-09', 'F01', '襯衣', '01', '02'


select a.* from  #ProductVersion a
where not exists (select * from #ProductVersion b 
 where REPLACE( b.VersionNo,'-','') =replace(a.VersionNo,'-','') -1 and a.Attr1 =b.Attr1  )

drop table #ProductVersion 

------解决方案--------------------
CREATE TABLE [dbo].[ProductVersion](
[VersionNo] [varchar](10) NULL,
[ProductId] [varchar](10) NULL,
[ProductName] [varchar](30) NULL,
[Attr1] [varchar](10) NULL,
[Attr2] [varchar](10) NULL
)

INSERT INTO dbo.ProductVersion
          SELECT  '2014-03-01', 'F01', '衬衣', '01', '01'
UNION ALL SELECT  '2014-03-02', 'F01', '衬衣', '01', '03'
UNION ALL SELECT  '2014-03-03', 'F01', '衬衣', '02', '03'
UNION ALL SELECT  '2014-03-04', 'F01', '衬衣', '04', '03'
UNION ALL SELECT  '2014-03-05', 'F01', '衬衣', '05', '03'
UNION ALL SELECT  '2014-03-06', 'F01', '衬衣', '01', '02'
UNION ALL SELECT  '2014-03-07', 'F01', '衬衣', '01', '04'
UNION ALL SELECT  '2014-03-08', 'F01', '衬衣', '05', '04'
UNION ALL SELECT  '2014-03-09', 'F01', '衬衣', '01', '02'


--SELECT * FROM dbo.ProductVersion