SQLserver近段时间学到的知识点

文章介绍了两种查询数据库中重复数据的方法:一是通过嵌套查询配合`HAVING`子句,二是利用窗口函数`ROW_NUMBER()`进行分组过滤。`WHERE`和`HAVING`的区别在于分组前后的过滤条件应用,而窗口函数能按特定分组和排序找出重复项。
摘要由CSDN通过智能技术生成

解决了数据问题之后,开始通过数据库查询语句实现一些表数据的导出,以下是本人近段时间学到的一些知识点,对工作成果的一种记录吧!

一、查询重复数据的几种方法

1、使用嵌套查询

select 运单编号 from 
    (
        SELECT 运单编号,count(1)as 数量
        from 账单数据
        group by 运单编号
    )as A
where A.数量>1

结果如下:

原本还在想能不能直接where count(1)>1,后来试了下出错了:

 

去搜了下发现是 where和count不能这样使用,where 运行顺序在select 之后,排第二,此时还没分组,所以会出错。

然后就开始面对现实,having平常工作过程中不怎么用,去搜了下发现where和having的区别在于,where是在分组前,取符合where条件的行,然后分组。而having子句是筛选满足条件的组,即在分组之后进行过滤数据。

select 运单编号
from 账单数据
group by 运单编号
having count(运单编号) >1

运行结果:

 

2、使用开窗函数

使用开窗函数,partition by 运单编号:按照运单编号分组,order by 结算重量 desc:组内按结算重量降序排列,相当于临时行号,然后查询临时行号大于1的即是重复数据。

 ;with cte as 
(
    select *,
           ROW_NUMBER() OVER (PARTITION BY 运单编号 ORDER BY 结算重量 desc) AS rn 
    from 账单数据
) 
select 运单编号 
from cte 
where cte.rn<>1

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值