【转】SQL查询案例:取得分组 TOP-N

CREATE TABLE TopnTest (

name     VARCHAR(10),   --姓名

procDate DATETIME,       --处理时间

result   INT              --成绩

);

INSERT INTO TopnTest VALUES('张三', '2010-10-01 12:00:05', 80);

INSERT INTO TopnTest VALUES('张三', '2010-10-01 12:20:05', 85);

INSERT INTO TopnTest VALUES('张三', '2010-10-02 07:25:15', 79);

INSERT INTO TopnTest VALUES('张三', '2010-10-02 10:30:05', 88);

INSERT INTO TopnTest VALUES('张三', '2010-10-03 15:05:05', 86);

INSERT INTO TopnTest VALUES('李四', '2010-10-01 06:00:05', 60);

INSERT INTO TopnTest VALUES('李四', '2010-10-04 08:00:05', 90);

INSERT INTO TopnTest VALUES('李四', '2010-10-05 10:00:05', 75);

INSERT INTO TopnTest VALUES('李四', '2010-10-08 11:00:05', 88);

INSERT INTO TopnTest VALUES('李四', '2010-10-09 12:00:05', 60);

INSERT INTO TopnTest VALUES('王五', '2010-09-10 08:00:05', 70);

INSERT INTO TopnTest VALUES('王五', '2010-09-14 08:00:05', 80);

INSERT INTO TopnTest VALUES('王五', '2010-09-25 18:00:05', 75);

INSERT INTO TopnTest VALUES('王五', '2010-09-28 18:00:05', 88);

INSERT INTO TopnTest VALUES('王五', '2010-10-09 12:00:05', 70);

要求

取得每个人的最近2次处理时间的详细记录情况。

思路

如果仅仅是一个人的最近2次,那么直接TOP 2或者Rownum <= 2可以处理。

每个人的最近1次,也可以通过SELECT MAX() GROUP BY来实现。

每个人的最近2次,需要自己和自己关联,才能解决了。

实现

SELECT

*

FROM

TopnTest

WHERE

( SELECT

COUNT(1)

FROM

TopnTest subTopnTest

WHERE

TopnTest.name = subTopnTest.name

AND TopnTest.procDate < subTopnTest.procDate

) < 2

ORDER BY

name, procDate

执行结果

name       procDate                result

---------- ----------------------- -----------

李四         2010-10-08 11:00:05.000          88

李四         2010-10-09 12:00:05.000          60

王五         2010-09-28 18:00:05.000          88

王五         2010-10-09 12:00:05.000          70

张三         2010-10-02 10:30:05.000          88

张三         2010-10-03 15:05:05.000          86

如果上面的 SQL , 你不怎么看得懂, 那么下面这样的写法,与执行结果,应该能让你更加容易明白一些上面的SQL的处理的原理。

SELECT 
  name,
  procDate,
  result,
  ( SELECT
      COUNT(1)
    FROM
      TopnTest subTopnTest
    WHERE
      TopnTest.name = subTopnTest.name
      AND TopnTest.procDate < subTopnTest.procDate
  ) AS [有多少行数据处理时间比当前行大]
FROM
  TopnTest
ORDER BY
  name, procDate

name       procDate                result      有多少行数据处理时间比当前行大
---------- ----------------------- ----------- ---------------
李四         2010-10-01 06:00:05.000          60               4
李四         2010-10-04 08:00:05.000          90               3
李四         2010-10-05 10:00:05.000          75               2
李四         2010-10-08 11:00:05.000          88               1
李四         2010-10-09 12:00:05.000          60               0
王五         2010-09-10 08:00:05.000          70               4
王五         2010-09-14 08:00:05.000          80               3
王五         2010-09-25 18:00:05.000          75               2
王五         2010-09-28 18:00:05.000          88               1
王五         2010-10-09 12:00:05.000          70               0
张三         2010-10-01 12:00:05.000          80               4
张三         2010-10-01 12:20:05.000          85               3
张三         2010-10-02 07:25:15.000          79               2
张三         2010-10-02 10:30:05.000          88               1
张三         2010-10-03 15:05:05.000          86               0

(15 行受影响)

QL查询案例:取得分组 TOP-N的更多相关文章

  1. golang xorm MSSQL where查询案例

    xorm官方中文文档 参考 http://xorm.io/docs/ 以sqlserver为例 先初始化连接等... engine, err := xorm.NewEngine("mssql ...

  2. 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 二.福利:账号借用 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! ...

  3. 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! 四.聚合分析 4.1 ...

  4. EJB3 QL查询

    http://www.blogjava.net/liaojiyong/archive/2008/07/11/56216.html EJB3 QL查询 EJB3的查询语言是一种和SQL非常类似的中间性和 ...

  5. SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表

    SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表 SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表 2013-10-09 23:09 by BI Wor ...

  6. (转)SQL查询案例:多行转换为一行

    原文:http://www.cnblogs.com/sammon/archive/2012/05/10/2494362.html 测试表与测试数据 CREATE TABLE TestTitle ( n ...

  7. Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by

    案例 案例:Laravel 在文章列表中附带上前10条评论?,在获取文章列表时同时把每个文章的前10条评论一同查询出来. 这是典型分区查询案例,需要根据 comments 表中的 post_id 字段 ...

  8. Mysql:实现分组查询拼接未分组同一字段字符group_concat()

    Mysql:实现分组查询拼接未分组同一字段字符group_concat() MySQL中,如果想实现将分组之后的多个数据合并到一列,可以使用group_concat函数,如下图所示: 在oralce中 ...

  9. ThinkPHP5 高级查询之构建分组条件

    ThinkPHP5 高级查询之构建分组条件 一.在tp5中通过where方法如何构建分组条件, 例如:where user_id=$this->user_id and (status in (4 ...

随机推荐

  1. WordPress Woopra Analytics插件‘ofc_upload_image.php’任意PHP代码执行漏洞

    漏洞名称: WordPress Woopra Analytics插件‘ofc_upload_image.php’任意PHP代码执行漏洞 CNNVD编号: CNNVD-201310-195 发布时间: ...

  2. Red and Black

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. HDU-3790 最短路径问题

    最短路径问题 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  4. Ubuntu配置Android编译环境

    1.Ubuntu安装 VMware安装ubuntu之后,安装Vmware tools: 1.安装完ubuntu后,VMware Workstation菜单:虚拟机-->安装 Vmware Too ...

  5. HTTP Authorization

    谨以此文献给那些需要实现HTTP AUTH的“程序猿”们. 关于HTTP AUTH的文档不多. RFC在 http://www.ietf.org/rfc/rfc2617.txt wiki在 http: ...

  6. 获取客户端IP地址 via C#

    获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同 ...

  7. rails第一次做项目

    最近这几天一直都是在做rails的入门,也就是熟悉rails的增.删.改.查操作,做到rails的入门.这几天的熟悉,只是对于操作的熟悉,对于rails语言的机制还有很多不是很熟悉.昨天接手第一个真正 ...

  8. log4j的使用方法

    1.Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析 2.Log4j的概念 Log4j中有三个主要的组件,它们分别是 Logger.Appender和Layout ...

  9. poj 1556 The Doors(线段相交,最短路)

      The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7430   Accepted: 2915 Descr ...

  10. OpenCL memory object 之 Global memory (1)

    本文转载自:http://www.cnblogs.com/mikewolf2002/archive/2011/12/17/2291239.html 这篇日志是学习AMD OpenCL文档时候的总结. ...