获取分组的前几组方法

简介:
获取分组的前几组方法。


/*Table structure for table `t` */

DROP TABLE IF EXISTS `t`;

CREATE TABLE `t` (
  `id` int(11) NOT NULL auto_increment,
  `g_id` int(11) NOT NULL,
  `t_str` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  key (`g_id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;

/*Data for the table `t` */

insert into `t`(`id`,`g_id`,`t_str`) values
(1,2,'wo'),
(2,2,'ni'),
(3,2,'ta'),
(4,3,'wo '),
(5,4,'ni'),
(6,3,'ni'),
(7,4,'ta'),
(8,3,'wang'),
(9,4,'li'),
(10,3,'hai'),
(11,4,'ri'),
(12,2,'ren'),
(13,5,'ta'),
(14,6,'ri'),
(15,6,'ren'),
(16,6,'fuck'),
(17,6,'shit'),
(18,5,'ls'),
(19,5,'chmod'),
(20,5,'chgrp'),
(21,5,'chown'),
(22,3,'rm'),
(23,3,'desc'),
(24,4,'pwd'),
(25,5,'cd');
1、相关子查询
(这个SQL语句是从ITPUB上来的。)
select a.* from t a where
(
select count(*) from t b where a.g_id = b.g_id and b.id<a.id
) < 2 order by a.g_id desc;

2、存储过程。
DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`sp_get_num_group`$$

CREATE PROCEDURE `test`.`sp_get_num_group`(
 IN f_num int)
BEGIN
  -- The variable stands for totla number of the record.
  declare cnt int default 0;
  declare i int;
  -- Create temp table to reserved the result.
  create temporary table if not exists tmp select * from t where 1 = 0;
  -- Get the total number of the group by record.
  select count(*) from
  (
    select count(*) from t group by g_id order by null
  ) T into cnt;
  set i = 0;
  while i < cnt
  do
    -- Get the real g_id one by one.
    set @stmt = concat('select g_id from t group by g_id order by g_id desc limit ',i,',1 into @tmp_id');
    prepare s1 from @stmt;
    execute s1;
    drop prepare s1;
    set @stmt = '';
    -- Get the needed data.
    set @stmt = concat('insert into tmp select * from t where g_id = ',@tmp_id,' limit ',f_num);
    prepare s1 from @stmt;
    execute s1;
    drop prepare s1;
    set @stmt = '';
    set @tmp_id = 0;
    set i = i + 1;
  end while;
  -- Get the record from temp table.
  select * from tmp order by g_id desc,id desc;
  -- Drop temp table.
  drop table tmp;
END$$

DELIMITER ;



本文转自 david_yeung 51CTO博客,原文链接: http://blog.51cto.com/yueliangdao0608/81270 ,如需转载请自行联系原作者
相关文章
|
6月前
|
JavaScript 前端开发 Java
55jqGrid 分组 - 多分组所有级数求和(新)
55jqGrid 分组 - 多分组所有级数求和(新)
31 0
55jqGrid 分组 - 多分组所有级数求和(新)
|
3月前
|
数据处理
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
24 0
|
9月前
|
Python
将列表按照指定的规则排序并添加平均值
将列表按照指定的规则排序并添加平均值
50 1
|
存储 数据挖掘 BI
【python数据分析】数据的分组,遍历,统计
数据的分组,遍历,统计 俗话说:“人与类聚,物以群分”,到这里我们将学习数据的分组以及分组后统计。Pandas的分组相对于Excel会更加简单和灵活。
【python数据分析】数据的分组,遍历,统计
|
SQL 数据挖掘 关系型数据库
数据的分组与计算
对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在数据集准备好之后,通常就是计算分组统计或生成透视表。pandas 提供了一个灵活高效的 groupby 功能,使我们可以高效地对数据集进行操作。 关系型数据库和 SQL 能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是,像 SQL 这样的查询语言所能执行的分组运算的种类很有限,而由于 pandas 强大的表达能力,我们可以执行复杂得多的分组运算。
95 0
|
Python
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
179 0
按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值
|
机器学习/深度学习 移动开发
【组合数学】排列组合 ( 集合组合、一一对应模型分析示例 )
【组合数学】排列组合 ( 集合组合、一一对应模型分析示例 )
151 0
|
Python
分组分析方法与实现
分组分析,是指将客体(问卷、特征、现实)按研究要求进行分类编组,使得同组客体之间的差别小于各种客体之间的差别,进而进行分析研究的方法。其特点在于不依赖于原始资料分布的正常性假设,可以按任意规律分布,在分析既包括数量资料,又包括质量资料的混合资料时尤为重要。
906 0
|
存储 算法 C++
经典算法详解(8)数的分组
题目:有10个任意的正整数,将其分为两组A和B,要求组A中每个数据的和与组B中每个数据的和之差的绝对值最小。请设计算法实现数的分组(找出一个答案即可)。 C++版本: 1 #include 2 3 using namespace std; 4 5 void get_groupAB(i...
1266 0