zoukankan      html  css  js  c++  java
  • SQL分类取每一类第一项

    实际应用中经常会碰到这样的需求,在给定的数据集中要求返回每一类型中最大的一条,抑或是最小的一条,抑或是按时间排序最近的一条等等。很多人面对这样的需求显得束手无策,其实这个需求实现有很多种方法,今天给大家介绍总结的几种方法。

    创建用例表

    CREATE TABLE [dbo].[Table_3](
    	[time] [datetime] NULL,
    	[City] [varchar](10) NULL,
    	[count] [int] NULL
    ) ON [PRIMARY]
    
    GO


    给用例表插入一些数据后,查用例表得到的结果

     需求是获得每个市的count值最大的一条记录,即

     

    方法1:group by

    SELECT City,MAX(count) as count 
    FROM [master].[dbo].[Table_3] 
    group by City


    这种方法的弊病是只能获取分组列和进行聚合函数运算的列的信息,丢失了其它列的信息

    方法2:ROW_NUMBER()

    with cte as
    (
    SELECT t.*,ROW_NUMBER() over(partition by City order by count desc) id
    FROM [master].[dbo].[Table_3] t
    ) select * from cte where id=1


    这种方法的好处就是不会丢弃列的信息,而且想获取某个分类的前一条,前二条都可以

    还有DENSE_RANK()和RANK()也可以用来分组排序,二者对于重复的数据都会给相同的编号,但是接下来的数据DENSE_RANK()是紧接着顺序编号,RANK()对于接下来的数据给予的编号是按照所处的位置编号。

    方法3:cross apply

    select b.* from
    (
    	SELECT distinct [City]
    	FROM [master].[dbo].[Table_3] a
    ) a
    cross apply (select top 1 * from [master].[dbo].[Table_3] t where a.City=t.City order by count) b


     

  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3285760.html
Copyright © 2011-2022 走看看