标题写的可能不是很好懂,那么就直接举例吧。
示例:,这是随便创建的一张表。
问题描述:我们现在想从表中取出每一个年龄段的一位用户进行电话回访。
解决思路:1.先查找出表中所有的年龄段。 2.对于每个年龄段取第一行,获取到相应数据后,进行数据合并。
首先想到的方法是先使用distinct取出表中的Age,然后去遍历取出的Age,对于每个Age再到表中取需要的数据,最后对零散遍历到的数据进行合并或者逐条存入临时表。
问题来了,如果我们需要对获取到的最终数据进行关联查询,那么就需要进行多步操作,这样虽然可以有助于我们理解程序,可是对于写代码的人来说无疑是痛苦的,本来一句话就可以完成的事为啥非要写的那么繁琐呢!
所以,换个思路,我们无非是想对于满足条件组中的某个条件的数据只取任意一条就够了。这个条件组就是我们的年龄段。满足任意一个年龄的数据只去一行数据即可。
于是我们先对条件进行分组,然后对满足组条件的数据取最小值,或者最大值即可(最小值或最大值的字段不能出现重复,比如当前示例中的电话号码是不可能出现重复的)。
那么整条语句就可以比较轻松的拼出来 select min(Telephone) from tbl_user group by Age;
看到这,有些朋友就会问了,如果要取的字段可能会出现最小值或者最大值重复怎么办?
无妨,咱们再换种思路,其实和上面的思路很相似,但适用性更广一些。 先使用条件组进行数据排序,这样每个条件的数据就会自动梳理在一起,咱们就取符合条件组中每个条件的第一行就行。这样即使是有重复或者完全相同数据,也只会取出第一条和条件匹配的。语句如下:
select Telephone from (
select Telephone, ROW_NUMBER() OVER (PARTITION BY Age ORDER BY Age) NewIndex from tbl_user ) a
WHERE a.NewIndex = 1