zoukankan      html  css  js  c++  java
  • 实习笔记-2:sql 分组不一定要group by

    今天在公司写代码的时候,遇到一个sql语句构建问题。

    情形是这样的:

    我需要获取不同小组下前N条记录。

    select top 10 * from dbo.Topic where GroupID in (60034,60037) and State=0  order by CrtTime desc

    很明显,这是错的,不仅没group by,获取出来的还是按两个小组的创建时间的前10条数据。

    可是,用group by的话,它有个很不通人性的特性。即是——凡是在group by后面出现的字段,必须同时在select后面出现;凡是在select后面出现的、同时未在聚合函数中出现的字段,必须同时出现在group by后面。

    这样就让我不得不放弃使用group by来分组查询。

    后来在网上找到,分组,不一定要用group by来实现。用row_number() over()同样可以实现。

    语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

    简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。

    row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

    有了这么一个函数存在,最终我构建了我的sql语句:

    select *
    from
    (
    select *,row_number() over (partition by GroupID order by CrtTime desc) rank from Topic where State=0
    ) T
    where T.rank<=10 and T.GroupID in(60034,60040)

    实现了这么一个功能:从不同的组别(60034,60040)里获取到了按创建时间降序排序的各个小组里的前10条记录。

    参考文章:sql查询-分组

         SQL ROW_NUMBER() OVER函数的基本用法用法

  • 相关阅读:
    C#
    C#
    C#
    python——socket网络编程
    Python——面向对象
    Python——函数
    Python——列表深浅拷贝
    Python——文件操作
    多级菜单(增强版)
    Python 编码机制
  • 原文地址:https://www.cnblogs.com/dieaz5/p/3335778.html
Copyright © 2011-2022 走看看