zoukankan      html  css  js  c++  java
  • SQL语句

      sql语句查询分类前几条信息

     
    1.SQL2005,情况下使用 行号 Row_Number()

    SELECT *
    FROM
    (
    SELECT ROW_NUMBER() OVER(PARTITION BY ct ORDER BY name) AS rnk,*
    FROM tb_name
    ) AS t
    WHERE rnk<=3

    讲解:用ROW_NUMBER() 以ct字段划分表数据,为每行数据添加行号。然后从这个结果集里查询出行号小于等于3的记录,就是每类的前3条记录。

    2.使用 CROSS APPLY


    SELECT DISTINCT b.*
    FROM tb_name AS a
    CROSS APPLY
    (
    SELECT TOP 3 *
    FROM tb_name
    WHERE a.ct=ct
    ) AS b ORDER BY b.ct


    讲解:主要利用CROSS APPLY,这类似join.

    首先在子查询里查询出表里每类的前3条记录,然后利用CROSS APPLY 和 DISTINCT ,把查询里相同的记录过滤掉。就是前3条记录了。

    不过这样的效率很低,不推荐使用。


    3. 利用子查询

    SELECT *
    FROM tb_name AS t
    WHERE 3>(SELECT COUNT(*)
    FROM tb_name
    WHERE ct=t.ct
    AND name>t.name);


    讲解:关键是子查询,这里类似一个while循环,每条记录去匹配和它同类的下一条记录。计算以它开始算起记录条数,意思就是他当前所在的行号,当行号小于3的时候,证明他下面有至多3条记录,则符合子查询条件,返回到结果集里。这样就查询出了每类的前3条记录。

    4.这种,我没有仔细看。就不讲解了,不过原理大概也就先是取每类的前3条记录,然后在结果集里用in最终取出结果。

    select * from @t a
    where checksum(*) in (select top 3 checksum(*) from @t b where a.ct=b.ct order by name desc)

    绝对经典SQL---分类查询前3条记录,并按某字段排序

    sql天地 2006-08-28 17:43:59 阅读54 评论2 字号:

    现有一表(成绩)

    id          姓名         科目         成绩         
    ----------- ---------- ---------- -----------
    1           小A         语文         70
    2           小A         数学         80
    3           小A         英语         90
    4           小B         语文         71
    5           小B         数学         81
    6           小B         英语         91
    7           小C         语文         72
    8           小C         数学         82
    9           小C         英语         92

    现在想查出每个学生的最高成绩科目的姓名,科目,成绩等信息,请问怎么写呢?

    select *
    from
    成绩 a
    where a.id in(select top 1 id
       from 成绩
       where 姓名=a.姓名
       group by id,成绩
       order by 成绩 desc)

    如果想要查询前N条的记录的,可以改(TOP N)

    floor:取小整数floor(123.45)=123,ceiling:取大整数ceiling(123.45)=124Top
    --------------------------------------------------------------------------------------------------------
  • 相关阅读:
    快速删除段落间多余的空行
    平时一些mysql小技巧及常识
    mysql中常用的控制流函数
    按年、季度、月分组&&计算日期和时间的函数
    Excel通过身份证获取出生年月,性别,年龄,生肖,星座,省份等信息总结归纳
    统计图表类型选择应用总结&表数据挖掘方法及应用
    EXCEL如何提取文字中包含的数字?
    一篇说尽Excel常见函数用法
    RStudio中,出现中文乱码问题的解决方案
    R-RMySQL包介绍学习
  • 原文地址:https://www.cnblogs.com/lisengl/p/3220726.html
Copyright © 2011-2022 走看看