• SQL Server 获取满足条件的每个条件下的前N条数据


    从数据库获取数据时,经常会遇到获取一个数据列表和该列表中每条数据对应的另一个列表的情况,如果二级列表获取的是全部数据,那么就比较简单。如果二级列表获取的是前n条数据,就会比较麻烦。

    从操作上来看,好像很简单,可以先从数据库获取一级列表,然后遍历,根据指定条件再次获取二级列表。但是,这样会多次连接数据库,严重影响从数据库获取数据的效率。从效率上考虑,最好是一次全部获取,这时候可以考虑使用分区函数PARTITION BY。

    语法:

    ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

    该语法表示根据COL1分组,在分组内部根据 COL2排序,而此语法计算的值就表示每组内部排序后的顺序编号(组内连续、唯一)

    示例:

    类别表:t_classinfo

              classid  classname 

                1         服饰

                2         箱包

    商品信息表:t_goodsinfo

     goodsid  goodsname  classid   ordernum

         1           上衣            1            1

         2           帽子            1            2

         3           裤子            1            3

         4           皮夹            2            1

         5           钱包            2            2

         6           皮带            2            3

    获取类别列表和每个类别下的两个商品信息

    sql 语句:

    select * from t_classinfo
    
    select * from (select  goodsid,goodsname,(ROW_NUMBER() OVER(PARTITION BY classid ORDER BY ordernum desc)) as rowid
            from t_goodsinfo) as g
    where g.rowid<=2
    order by classid asc

    查询结果:

    classid  classname 

       1         服饰

       2         箱包

     goodsid  goodsname  rowid 

         3           裤子            1 

         2           帽子            2 

         6           皮带            1 

         5           钱包            2 

  • 相关阅读:
    求列表中指定元素的位置
    Hash_P1026毒药?解药?
    Hash_集合
    bzoj1483: [HNOI2009]梦幻布丁
    bzoj1724: [Usaco2006 Nov]Fence Repair 切割木板
    容斥原理
    bzoj1042: [HAOI2008]硬币购物
    [Noi2016十连测第五场]二进制的世界
    NOI2016模拟赛Zbox loves stack
    bzoj2038: [2009国家集训队]小Z的袜子(hose)
  • 原文地址:https://www.cnblogs.com/ant-jmf17/p/7158770.html
Copyright © 2020-2023  润新知