取得分组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 行受影响)
分享到:
相关推荐
如果需要,可以手动调整每个字段的位置以适应纵向布局。 4. **定制显示样式**:为了使数据更容易阅读,你可能需要调整字体大小、颜色、边框等视觉元素。还可以使用条件格式化来突出显示特定的值或状态。 5. **测试...
在这个例子中,`POSITION (M:N)` 用于指定每个字段在每行中的起始位置和结束位置。这种方式特别适用于固定宽度的数据文件。 #### 五、SQL*Loader的高级特性 SQL*Loader 还提供了许多高级特性,这些特性使得数据导入...
在MySQL数据库中,获取每个分类的前N条记录是一个常见的查询需求,特别是在处理如文章、商品、用户等分组信息时。以下将详细介绍如何通过SQL语句实现这一功能,并给出三个示例。 首先,我们需要理解基本的SQL语法,...
根据提供的标题“从N行读到M行的数据sql语句”及描述“用sql语句写从N行读到M行的数据”,我们可以详细地探讨如何通过SQL语句来实现这一功能。 ### SQL获取指定行范围的数据 #### 知识点一:`ROW_NUMBER()`函数 在...
下面,我们将深入探讨如何使用Oracle SQL中的游标来分批取数据,并通过一个具体示例来展示这一过程。 ### 游标分批取数据原理 在Oracle SQL中,游标提供了对查询结果集的访问方式,它允许我们逐行或分批读取数据,...
它提供了每个成语的标准汉语拼音,如“huà shé tiān zú”和“wáng yáng bǔ láo”。 再者,内容字段,可能标记为`content`,记录了成语的含义和用法,解释了成语在句子中的作用和表达的意思。例如,...
在这个例子中,作者针对一个包含20万条记录和69个字段的`TORDER`表,设计了一种分页方法,主要基于`prodorderno`作为主索引字段,并且可以使用任意字段进行分页。 首先,我们需要理解基本的分页概念。分页通常涉及...
每个文件组下又分别添加了数据文件和索引文件。例如,在`NNC_DATA01`文件组中,添加了一个名为`nnc_data01`的数据文件,其初始大小为800MB,增长量为200MB;而在`NNC_INDEX01`文件组中,添加了一个名为`nnc_index01`...
4. **使用UNION操作符**:如果你有多个单独的INSERT语句,可以用UNION来合并它们,但请注意,这种方法通常限制了每批插入的行数,并且所有INSERT语句必须具有相同的列数和数据类型: ```sql INSERT INTO 表名 (列...
在处理数据库查询时,经常会遇到需要对表中的数据进行分组,并从每个分组中选取特定行的情况。这种需求可以通过多种方法实现,包括子查询、`ROW_NUMBER()`函数以及`APPLY`操作等。本文将详细介绍这些方法,并通过一...
特征值表示了主成分的方向,而特征向量表示了每个主成分所解释的数据方差的比例。 - **主成分的选择**:根据特征值的大小,选择那些解释了大部分数据方差的主成分。通常情况下,会选择累计贡献率达到85%以上的主成分...
事务复制是将数据库的每个事务复制到订阅服务器上;合并复制是将数据库的变化合并到订阅服务器上。 下面我们将一步一步地实现数据同步的步骤: 第一步:配置出版服务器 (1)选中指定的服务器节点 (2)从工具下拉...
接着,我们使用MoveFirst()和MoveNext()遍历记录,获取并处理每个字段的值。最后,关闭记录集和数据库连接。 除了基本的CRUD操作,MFC还提供了事务处理、参数化查询、BLOB字段处理等功能。开发者可以根据需求灵活...
根据提供的信息来看,这篇文章主要涉及的是SQL中...通过上述例子,我们可以看到如何使用SQL语言实现这一转换,以及动态SQL在这种场景下的应用。理解这些概念和技术可以帮助我们在实际工作中更加高效地管理和分析数据。
在这个例子中,内层子查询先对表`tableName`进行了排序,并为每一条记录分配了行号;外层查询则通过`WHERE rnum 筛选出了前10条记录。 ### 二、MySQL数据库中获取前10条记录 MySQL数据库提供了更为简单的语法来...
`xlrd`库提供了遍历行和列的方法,例如`sheet.nrows`和`sheet.ncols`,以便访问每个单元格的值。 5. **构建SQL插入语句**:在循环中,遍历Excel文件中的每一行和每一列,将单元格的值转化为字符串,并用逗号分隔。...
在这个例子中,`LIMIT 10, 20`表示从第11条记录开始取20条记录,也就是第10页的数据。 2. **注意事项:** - `LIMIT`关键字非常直观易用,但在大数据量的情况下,如果`OFFSET`值过大,性能会受到影响。 - 可以...
首先筛选出区域为“WA”的客户,然后对每个客户的订单进行遍历。`waCustomers`包含了满足条件的客户,`foreach`循环首先遍历客户,再遍历客户的订单。 ```csharp List<Customer> customers = GetCustomerList(); ...
在上述例子中,我们先为每个城市的每个产品按添加时间降序分配行号,然后筛选出行号小于或等于11(即每组的前10个)的记录。这种方法在多次测试中平均耗时8秒,速度最快,且对于大数据量的处理表现良好,是首选的...