2021-08-13

博客介绍了使用SQL去除数据重复行的方法,通过ROW_NUMBER() OVER(PARTITION BY ORDER BY)函数实现。示例中展示了原始数据包含大量重复行,经过处理后仅保留第一条重复数据,同时展示所有不重复的数据。查询结果对比显示了处理前后的效果。
摘要由CSDN通过智能技术生成

SQL实现多条数据重复行只显示一条,非重复的数据全部显示

今天导数据,发现很多都是重复列,只有一两行数据是不重复的,由于才接触SQL不久,就试了下,最终借助ROW_NUMBER()OVER(PARTITION BYORDER BY)实现了,记录哈

在这里插入代码片
SELECT 
CASE WHEN CONVERT(INT,Row_num) = 1 THEN OrderName  ELSE '' END AS OrderName ,
CASE WHEN Row_num = 1 THEN Seq ELSE '' END AS Seq,
CASE WHEN Row_num = 1 THEN TNR ELSE '' END ,
//不想As了,太累了,但凡重复过多就累了,所以一直想可不可以不写这么多的case when 实现,奈何额不晓得。
CASE WHEN Row_num = 1 THEN Description ELSE '' END,
CASE WHEN Row_num = 1 THEN SO ELSE '' END,
CASE WHEN Row_num = 1 THEN  CONVERT(NVARCHAR(20),POS) ELSE '' END,
//做类型转化呢,是因为这些字段有decimal类型和int类型,1.解决报错;2.int为空时显示0,为了好看自然不要0,我要空
CASE WHEN Row_num = 1 THEN  CONVERT(NVARCHAR(20),Qty) ELSE '' END,
CASE WHEN Row_num = 1 THEN  CONVERT(NVARCHAR(20),QtyDone) ELSE '' END,
CASE WHEN Row_num = 1 THEN  CONVERT(NVARCHAR(20),IsDelete) ELSE '' END,
CASE WHEN Row_num = 1 THEN  CONVERT(NVARCHAR(20),IsClose) ELSE '' END,
CASE WHEN Row_num = 1 THEN  CONVERT(NVARCHAR(20),CreateDate,121) ELSE '' END,
lot,Box,lotQ 
FROM (
SELECT a.OrderName,b.Seq,b.TNR,e.Description,b.SO,b.POS,b.Qty,b.QtyDone,b.IsDelete,b.IsClose,b.CreateDate,c.lot,c.Box,c.Qty AS LotQ,
CONVERT(INT,ROW_NUMBER()OVER(PARTITION BY a.OrderName,b.Seq,b.TNR,e.Description,b.SO,b.POS,b.Qty,b.QtyDone,b.IsDelete,b.IsClose,b.CreateDate 
ORDER BY c.lot,c.Box,c.Qty,b.CreateDate ) )AS Row_num 
FROM POrder a 
left JOIN OrderItem b ON b.POrderId = a.POrderId 
left JOIN OrderItemLot c ON c.OrderItemId = b.OrderItemId
left JOIN lot d ON d.LotSN = c.LotSN  
left JOIN product e ON e.ProductId=b.ProductId
LEFT JOIN productRoot f ON f.ProductId=b.ProductId
WHERE OrderName LIKE '89%' AND a.IsClose=0 ) AS Pdata
|  |  |
第一版查询
|
**90000***	000040	***20003***	****611	4	50153.0000	50153.0000	0	1	2022-03-09 07:34:39.400	***VJ	***0M	10000.0000	1
**90000***	000040	***20003***	****611	4	50153.0000	50153.0000	0	1	2022-03-09 07:34:39.400	***VL	***0M	10000.0000	2
**90000***	000040	***20003***	****611	4	50153.0000	50153.0000	0	1	2022-03-09 07:34:39.400	***VN	***0M	10000.0000	3
**90000***	000040	***20003***	****611	4	50153.0000	50153.0000	0	1	2022-03-09 07:34:39.400	***VR	***0M	10000.0000	4
**90000***	000040	***20003***	****611	4	50153.0000	50153.0000	0	1	2022-03-09 07:34:39.400	***W5	***0M	10000.0000	5
**90000***	000040	***20003***	****611	4	50153.0000	50153.0000	0	1	2022-03-09 07:34:39.400	***DY	***0M	153.0000	6
**90000***	000050	***40000*** ****611 5	259.0000	259.0000	0	1	2022-03-09 07:34:39.407	***JS	***VV	259.0000	1
**90000***	000060	***40007*** ****611	6	101000.0000	101000.0000	0	1	2022-03-09 07:34:39.413	***JT	***GJ	101000.0000	1
|
第二版查询
**90000***	000040	***20003***	****611	4	50153.0000	50153.0000	0	1	2022-03-09 07:34:39.400	***VJ	***0M	10000.0000	
																									***VL	***0M	10000.0000	
																									***VN	***0M	10000.0000	
																									***VR	***0M	10000.0000	
																									***W5	***0M	10000.0000	
																									***DY	***0M	153.0000	
**90000***	000050	***40000*** ****611	5	259.0000	259.0000	0	1	2022-03-09 07:34:39.407	***JS	***VV	259.0000	
**90000***	000060	***40007*** ****611	6	101000.0000	101000.0000	0	1	2022-03-09 07:34:39.413	***JT	***GJ	101000.0000	
|  |  |
别问为什么带*号,问就是别人的数据,被认出来多尴尬!!!haha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值