产品给了个活,表的关系是一对多,但每次关联都会有重复数据列出现,让我很是头疼,于是翻阅网站,找到一种方法可以去掉这些重复的列。通过 case when 与
ROW_NUMBER() OVER ( PARTITION BY ‘相同数据字段’ ORDER BY 排序字段) ROW。
在这里做个问题记录,同时也希望帮助遇到此类问题的伙伴。
原理的话是通过 PARTITION 对重复的字段做分区排序
SELECT *,ROW_NUMBER() OVER ( PARTITION BY VALUE
ORDER BY GETDATE() ) row FROM TABLE
效果如下
那把它通过CASE WHEN 做筛选
语句如下`
SELECT CASE WHEN row = 1 THEN BILLNO
ELSE '' END BILLNO,
CASE WHEN row = 1 THEN BILLCODE
ELSE '' END BILLCODE,
CASE WHEN row = 1 THEN STRING
ELSE '' END STRING,BRNO,ID
FROM ( SELECT *,ROW_NUMBER() OVER ( PARTITION BY BILLNO, BILLCODE,STRING ORDER BY GETDATE() ) row
FROM #TABLEA) B
执行后效果如下。
把重复的数据列去掉了。
下面是数据源以及语句。大家可以试一下
CREATE TABLE #TABLEA
(
BILLNO VARCHAR(10) ,
BILLCODE VARCHAR(10) ,
STRING NVARCHAR(20) ,
BRNO VARCHAR(20) ,
ID INT
)
insert INTO #TABLEA SELECT 'HD01','0101520',N'嗨害嗨','102020',2
insert INTO #TABLEA SELECT 'HD01','0101520',N'嗨害嗨','101010',2
insert INTO #TABLEA SELECT 'HD01','0101520',N'嗨害嗨','126888',2
insert INTO #TABLEA SELECT 'HD02','01012221',N'嗯怎么不算呢','102020',2
insert INTO #TABLEA SELECT 'HD03','12312312',N'不发火是不是把人当傻子啊','102020',2
insert INTO #TABLEA SELECT 'HD03','12312312',N'不发火是不是把人当傻子啊','102020',2
insert INTO #TABLEA SELECT 'HD04','12312344',N'把我lining踹开线了','102020',2
SELECT CASE WHEN row = 1 THEN BILLNO
ELSE '' END BILLNO,
CASE WHEN row = 1 THEN BILLCODE
ELSE '' END BILLCODE,
CASE WHEN row = 1 THEN STRING
ELSE '' END STRING,BRNO,ID
FROM ( SELECT *,ROW_NUMBER() OVER ( PARTITION BY BILLNO, BILLCODE,STRING ORDER BY GETDATE() ) row
FROM #TABLEA) B