日期:2014-05-17  浏览次数:20291 次

sql 行号问题
表A记录如下
1 张三
2 张三
3 李四
4 王五
5 张三
上表为:个人登记记录(自动编号,姓名)
如果姓名连续出现两次则算一次

期望查询结果为

编号,姓名
1,张三
2,李四
3,王五
4,张三

用excel 我可以比较两行之间的关系,sql没有,不知怎么处理




------解决方案--------------------
不太确定你想要哪一种,就写了两个 


SQL code

--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([id] INT,[name] VARCHAR(4))
INSERT [tb]
SELECT 1,'张三' UNION ALL
SELECT 2,'张三' UNION ALL
SELECT 3,'李四' UNION ALL
SELECT 4,'王五' UNION ALL
SELECT 5,'张三' UNION ALL
SELECT 8,'张三' UNION ALL
SELECT 9,'张三' UNION ALL 
SELECT 11,'张三' UNION ALL 
SELECT 12,'王五'
--------------开始查询--------------------------

--1
;WITH cte AS
(
SELECT *,row_id=ROW_NUMBER() OVER(ORDER BY id) FROM [tb]
)
SELECT id=ROW_NUMBER() OVER(ORDER BY id),name FROM cte  AS a 
WHERE NOT EXISTS(SELECT 1 FROM cte WHERE [name]=a.[name] AND [row_id]=a.[row_id]-1 )
--2
SELECT id=ROW_NUMBER() OVER(ORDER BY id),name FROM [tb]  AS a 
WHERE NOT EXISTS(SELECT 1 FROM [tb] WHERE [name]=a.[name] AND [id]=a.[id]-1 )

------解决方案--------------------
SQL code
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )