- 浏览: 246099 次
-
文章分类
最新评论
http://code.openark.org/blog/mysql/sql-selecting-top-n-records-per-group
SQL: selecting top N records per group
January 6, 2011
A while back I presented(*) an SQL trick to present with non-aggregated column on a GROUP BY query, without use of subquery or derived tables.
Based on a similar concept, combined with string walking, I now present a query which selects top-n records for each group, ordered by some condition. It will require no subqueries. It executes faster than its more conventional alternatives.
[UPDATE: this is MySQL only. Others can use Window Functions where available]
Using the simple world database, we answer the following question:
What are the top 5 largest (by area) countries for each continent? What are their names, surface area and population?
Similar questions would be:
What were the latest 5 films rented by each customer?
What were the most presented advertisements for each user?
etc.
Step 1: getting the top
We already know how to get a single column's value for the top country, as presented in the aforementioned post:
SELECT
Continent,
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', 1) AS Name
FROM
Country
GROUP BY
Continent
;
+---------------+--------------------+
| Continent | Name |
+---------------+--------------------+
| Asia | China |
| Europe | Russian Federation |
| North America | Canada |
| Africa | Sudan |
| Oceania | Australia |
| Antarctica | Antarctica |
| South America | Brazil |
+---------------+--------------------+
Step 2: adding columns
This part is easy: just throw in the rest of the columns (again, only indicating the top country in each continent)
SELECT
Continent,
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', 1) AS Name,
SUBSTRING_INDEX(
GROUP_CONCAT(SurfaceArea ORDER BY SurfaceArea DESC),
',', 1) AS SurfaceArea,
SUBSTRING_INDEX(
GROUP_CONCAT(Population ORDER BY SurfaceArea DESC),
',', 1) AS Population
FROM
Country
GROUP BY
Continent
;
+---------------+--------------------+-------------+------------+
| Continent | Name | SurfaceArea | Population |
+---------------+--------------------+-------------+------------+
| Asia | China | 9572900.00 | 1277558000 |
| Europe | Russian Federation | 17075400.00 | 146934000 |
| North America | Canada | 9970610.00 | 31147000 |
| Africa | Sudan | 2505813.00 | 29490000 |
| Oceania | Australia | 7741220.00 | 18886000 |
| Antarctica | Antarctica | 13120000.00 | 0 |
| South America | Brazil | 8547403.00 | 170115000 |
+---------------+--------------------+-------------+------------+
Step 3: casting
You'll notice that the Population column from this last execution is aligned to the left. This is because it is believed to be a string. The GROUP_CONCAT clause concatenates values in one string, and SUBSTRING_INDEX parses a substring. The same applies to the SurfaceArea column. We'll cast Population as UNSIGNED and SurfaceArea as DECIMAL:
SELECT
Continent,
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', 1) AS Name,
CAST(
SUBSTRING_INDEX(
GROUP_CONCAT(SurfaceArea ORDER BY SurfaceArea DESC),
',', 1)
AS DECIMAL(20,2)
) AS SurfaceArea,
CAST(
SUBSTRING_INDEX(
GROUP_CONCAT(Population ORDER BY SurfaceArea DESC),
',', 1)
AS UNSIGNED
) AS Population
FROM
Country
GROUP BY
Continent
;
+---------------+--------------------+-------------+------------+
| Continent | Name | SurfaceArea | Population |
+---------------+--------------------+-------------+------------+
| Asia | China | 9572900.00 | 1277558000 |
| Europe | Russian Federation | 17075400.00 | 146934000 |
| North America | Canada | 9970610.00 | 31147000 |
| Africa | Sudan | 2505813.00 | 29490000 |
| Oceania | Australia | 7741220.00 | 18886000 |
| Antarctica | Antarctica | 13120000.00 | 0 |
| South America | Brazil | 8547403.00 | 170115000 |
+---------------+--------------------+-------------+------------+
Step 4: top n records
It's time to use string walking. Examples for string walking (described in the excellent SQL Cookbook) can be found here, here and here. We'll be using a numbers table: a simple table which lists ascending integer numbers. For example, you can use the following:
DROP TABLE IF EXISTS `tinyint_asc`;
CREATE TABLE `tinyint_asc` (
`value` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (value)
) ;
INSERT INTO `tinyint_asc` VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31),(32),(33),(34),(35),(36),(37),(38),(39),(40),(41),(42),(43),(44),(45),(46),(47),(48),(49),(50),(51),(52),(53),(54),(55),(56),(57),(58),(59),(60),(61),(62),(63),(64),(65),(66),(67),(68),(69),(70),(71),(72),(73),(74),(75),(76),(77),(78),(79),(80),(81),(82),(83),(84),(85),(86),(87),(88),(89),(90),(91),(92),(93),(94),(95),(96),(97),(98),(99),(100),(101),(102),(103),(104),(105),(106),(107),(108),(109),(110),(111),(112),(113),(114),(115),(116),(117),(118),(119),(120),(121),(122),(123),(124),(125),(126),(127),(128),(129),(130),(131),(132),(133),(134),(135),(136),(137),(138),(139),(140),(141),(142),(143),(144),(145),(146),(147),(148),(149),(150),(151),(152),(153),(154),(155),(156),(157),(158),(159),(160),(161),(162),(163),(164),(165),(166),(167),(168),(169),(170),(171),(172),(173),(174),(175),(176),(177),(178),(179),(180),(181),(182),(183),(184),(185),(186),(187),(188),(189),(190),(191),(192),(193),(194),(195),(196),(197),(198),(199),(200),(201),(202),(203),(204),(205),(206),(207),(208),(209),(210),(211),(212),(213),(214),(215),(216),(217),(218),(219),(220),(221),(222),(223),(224),(225),(226),(227),(228),(229),(230),(231),(232),(233),(234),(235),(236),(237),(238),(239),(240),(241),(242),(243),(244),(245),(246),(247),(248),(249),(250),(251),(252),(253),(254),(255);
The trick is to apply the same technique as used above, not for a single row, but for several rows. Here's how to present the top 5 countries:
SELECT
Continent,
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', value),
',', -1)
AS Name,
CAST(
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(SurfaceArea ORDER BY SurfaceArea DESC),
',', value),
',', -1)
AS DECIMAL(20,2)
) AS SurfaceArea,
CAST(
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(Population ORDER BY SurfaceArea DESC),
',', value),
',', -1)
AS UNSIGNED
) AS Population
FROM
Country, tinyint_asc
WHERE
tinyint_asc.value >= 1 AND tinyint_asc.value <= 5
GROUP BY
Continent, value
;
+---------------+----------------------------------------------+-------------+------------+
| Continent | Name | SurfaceArea | Population |
+---------------+----------------------------------------------+-------------+------------+
| Asia | China | 9572900.00 | 1277558000 |
| Asia | India | 3287263.00 | 1013662000 |
| Asia | Kazakstan | 2724900.00 | 16223000 |
| Asia | Saudi Arabia | 2149690.00 | 21607000 |
| Asia | Indonesia | 1904569.00 | 212107000 |
| Europe | Russian Federation | 17075400.00 | 146934000 |
| Europe | Ukraine | 603700.00 | 50456000 |
| Europe | France | 551500.00 | 59225700 |
| Europe | Spain | 505992.00 | 39441700 |
| Europe | Sweden | 449964.00 | 8861400 |
| North America | Canada | 9970610.00 | 31147000 |
| North America | United States | 9363520.00 | 278357000 |
| North America | Greenland | 2166090.00 | 56000 |
| North America | Mexico | 1958201.00 | 98881000 |
| North America | Nicaragua | 130000.00 | 5074000 |
| Africa | Sudan | 2505813.00 | 29490000 |
| Africa | Algeria | 2381741.00 | 31471000 |
| Africa | Congo | 2344858.00 | 51654000 |
| Africa | The Democratic Republic of the | 1759540.00 | 5605000 |
| Africa | Libyan Arab Jamahiriya | 1284000.00 | 7651000 |
| Oceania | Australia | 7741220.00 | 18886000 |
| Oceania | Papua New Guinea | 462840.00 | 4807000 |
| Oceania | New Zealand | 270534.00 | 3862000 |
| Oceania | Solomon Islands | 28896.00 | 444000 |
| Oceania | New Caledonia | 18575.00 | 214000 |
| Antarctica | Antarctica | 13120000.00 | 0 |
| Antarctica | French Southern territories | 7780.00 | 0 |
| Antarctica | South Georgia and the South Sandwich Islands | 3903.00 | 0 |
| Antarctica | Heard Island and McDonald Islands | 359.00 | 0 |
| Antarctica | Bouvet Island | 59.00 | 0 |
| South America | Brazil | 8547403.00 | 170115000 |
| South America | Argentina | 2780400.00 | 37032000 |
| South America | Peru | 1285216.00 | 25662000 |
| South America | Colombia | 1138914.00 | 42321000 |
| South America | Bolivia | 1098581.00 | 8329000 |
+---------------+----------------------------------------------+-------------+------------+
Limitations
You should have:
Enough numbers in the numbers table (I've used 5 out of 255)
Reasonable setting for group_concat_max_len (see this post). Actually it would be better to have a smaller value here, while you make sure it's large enough; this way you do not waste memory for large groups.
(*) This was two years ago! I'm getting old
SQL: selecting top N records per group
January 6, 2011
A while back I presented(*) an SQL trick to present with non-aggregated column on a GROUP BY query, without use of subquery or derived tables.
Based on a similar concept, combined with string walking, I now present a query which selects top-n records for each group, ordered by some condition. It will require no subqueries. It executes faster than its more conventional alternatives.
[UPDATE: this is MySQL only. Others can use Window Functions where available]
Using the simple world database, we answer the following question:
What are the top 5 largest (by area) countries for each continent? What are their names, surface area and population?
Similar questions would be:
What were the latest 5 films rented by each customer?
What were the most presented advertisements for each user?
etc.
Step 1: getting the top
We already know how to get a single column's value for the top country, as presented in the aforementioned post:
SELECT
Continent,
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', 1) AS Name
FROM
Country
GROUP BY
Continent
;
+---------------+--------------------+
| Continent | Name |
+---------------+--------------------+
| Asia | China |
| Europe | Russian Federation |
| North America | Canada |
| Africa | Sudan |
| Oceania | Australia |
| Antarctica | Antarctica |
| South America | Brazil |
+---------------+--------------------+
Step 2: adding columns
This part is easy: just throw in the rest of the columns (again, only indicating the top country in each continent)
SELECT
Continent,
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', 1) AS Name,
SUBSTRING_INDEX(
GROUP_CONCAT(SurfaceArea ORDER BY SurfaceArea DESC),
',', 1) AS SurfaceArea,
SUBSTRING_INDEX(
GROUP_CONCAT(Population ORDER BY SurfaceArea DESC),
',', 1) AS Population
FROM
Country
GROUP BY
Continent
;
+---------------+--------------------+-------------+------------+
| Continent | Name | SurfaceArea | Population |
+---------------+--------------------+-------------+------------+
| Asia | China | 9572900.00 | 1277558000 |
| Europe | Russian Federation | 17075400.00 | 146934000 |
| North America | Canada | 9970610.00 | 31147000 |
| Africa | Sudan | 2505813.00 | 29490000 |
| Oceania | Australia | 7741220.00 | 18886000 |
| Antarctica | Antarctica | 13120000.00 | 0 |
| South America | Brazil | 8547403.00 | 170115000 |
+---------------+--------------------+-------------+------------+
Step 3: casting
You'll notice that the Population column from this last execution is aligned to the left. This is because it is believed to be a string. The GROUP_CONCAT clause concatenates values in one string, and SUBSTRING_INDEX parses a substring. The same applies to the SurfaceArea column. We'll cast Population as UNSIGNED and SurfaceArea as DECIMAL:
SELECT
Continent,
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', 1) AS Name,
CAST(
SUBSTRING_INDEX(
GROUP_CONCAT(SurfaceArea ORDER BY SurfaceArea DESC),
',', 1)
AS DECIMAL(20,2)
) AS SurfaceArea,
CAST(
SUBSTRING_INDEX(
GROUP_CONCAT(Population ORDER BY SurfaceArea DESC),
',', 1)
AS UNSIGNED
) AS Population
FROM
Country
GROUP BY
Continent
;
+---------------+--------------------+-------------+------------+
| Continent | Name | SurfaceArea | Population |
+---------------+--------------------+-------------+------------+
| Asia | China | 9572900.00 | 1277558000 |
| Europe | Russian Federation | 17075400.00 | 146934000 |
| North America | Canada | 9970610.00 | 31147000 |
| Africa | Sudan | 2505813.00 | 29490000 |
| Oceania | Australia | 7741220.00 | 18886000 |
| Antarctica | Antarctica | 13120000.00 | 0 |
| South America | Brazil | 8547403.00 | 170115000 |
+---------------+--------------------+-------------+------------+
Step 4: top n records
It's time to use string walking. Examples for string walking (described in the excellent SQL Cookbook) can be found here, here and here. We'll be using a numbers table: a simple table which lists ascending integer numbers. For example, you can use the following:
DROP TABLE IF EXISTS `tinyint_asc`;
CREATE TABLE `tinyint_asc` (
`value` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (value)
) ;
INSERT INTO `tinyint_asc` VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),(30),(31),(32),(33),(34),(35),(36),(37),(38),(39),(40),(41),(42),(43),(44),(45),(46),(47),(48),(49),(50),(51),(52),(53),(54),(55),(56),(57),(58),(59),(60),(61),(62),(63),(64),(65),(66),(67),(68),(69),(70),(71),(72),(73),(74),(75),(76),(77),(78),(79),(80),(81),(82),(83),(84),(85),(86),(87),(88),(89),(90),(91),(92),(93),(94),(95),(96),(97),(98),(99),(100),(101),(102),(103),(104),(105),(106),(107),(108),(109),(110),(111),(112),(113),(114),(115),(116),(117),(118),(119),(120),(121),(122),(123),(124),(125),(126),(127),(128),(129),(130),(131),(132),(133),(134),(135),(136),(137),(138),(139),(140),(141),(142),(143),(144),(145),(146),(147),(148),(149),(150),(151),(152),(153),(154),(155),(156),(157),(158),(159),(160),(161),(162),(163),(164),(165),(166),(167),(168),(169),(170),(171),(172),(173),(174),(175),(176),(177),(178),(179),(180),(181),(182),(183),(184),(185),(186),(187),(188),(189),(190),(191),(192),(193),(194),(195),(196),(197),(198),(199),(200),(201),(202),(203),(204),(205),(206),(207),(208),(209),(210),(211),(212),(213),(214),(215),(216),(217),(218),(219),(220),(221),(222),(223),(224),(225),(226),(227),(228),(229),(230),(231),(232),(233),(234),(235),(236),(237),(238),(239),(240),(241),(242),(243),(244),(245),(246),(247),(248),(249),(250),(251),(252),(253),(254),(255);
The trick is to apply the same technique as used above, not for a single row, but for several rows. Here's how to present the top 5 countries:
SELECT
Continent,
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(Name ORDER BY SurfaceArea DESC),
',', value),
',', -1)
AS Name,
CAST(
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(SurfaceArea ORDER BY SurfaceArea DESC),
',', value),
',', -1)
AS DECIMAL(20,2)
) AS SurfaceArea,
CAST(
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(Population ORDER BY SurfaceArea DESC),
',', value),
',', -1)
AS UNSIGNED
) AS Population
FROM
Country, tinyint_asc
WHERE
tinyint_asc.value >= 1 AND tinyint_asc.value <= 5
GROUP BY
Continent, value
;
+---------------+----------------------------------------------+-------------+------------+
| Continent | Name | SurfaceArea | Population |
+---------------+----------------------------------------------+-------------+------------+
| Asia | China | 9572900.00 | 1277558000 |
| Asia | India | 3287263.00 | 1013662000 |
| Asia | Kazakstan | 2724900.00 | 16223000 |
| Asia | Saudi Arabia | 2149690.00 | 21607000 |
| Asia | Indonesia | 1904569.00 | 212107000 |
| Europe | Russian Federation | 17075400.00 | 146934000 |
| Europe | Ukraine | 603700.00 | 50456000 |
| Europe | France | 551500.00 | 59225700 |
| Europe | Spain | 505992.00 | 39441700 |
| Europe | Sweden | 449964.00 | 8861400 |
| North America | Canada | 9970610.00 | 31147000 |
| North America | United States | 9363520.00 | 278357000 |
| North America | Greenland | 2166090.00 | 56000 |
| North America | Mexico | 1958201.00 | 98881000 |
| North America | Nicaragua | 130000.00 | 5074000 |
| Africa | Sudan | 2505813.00 | 29490000 |
| Africa | Algeria | 2381741.00 | 31471000 |
| Africa | Congo | 2344858.00 | 51654000 |
| Africa | The Democratic Republic of the | 1759540.00 | 5605000 |
| Africa | Libyan Arab Jamahiriya | 1284000.00 | 7651000 |
| Oceania | Australia | 7741220.00 | 18886000 |
| Oceania | Papua New Guinea | 462840.00 | 4807000 |
| Oceania | New Zealand | 270534.00 | 3862000 |
| Oceania | Solomon Islands | 28896.00 | 444000 |
| Oceania | New Caledonia | 18575.00 | 214000 |
| Antarctica | Antarctica | 13120000.00 | 0 |
| Antarctica | French Southern territories | 7780.00 | 0 |
| Antarctica | South Georgia and the South Sandwich Islands | 3903.00 | 0 |
| Antarctica | Heard Island and McDonald Islands | 359.00 | 0 |
| Antarctica | Bouvet Island | 59.00 | 0 |
| South America | Brazil | 8547403.00 | 170115000 |
| South America | Argentina | 2780400.00 | 37032000 |
| South America | Peru | 1285216.00 | 25662000 |
| South America | Colombia | 1138914.00 | 42321000 |
| South America | Bolivia | 1098581.00 | 8329000 |
+---------------+----------------------------------------------+-------------+------------+
Limitations
You should have:
Enough numbers in the numbers table (I've used 5 out of 255)
Reasonable setting for group_concat_max_len (see this post). Actually it would be better to have a smaller value here, while you make sure it's large enough; this way you do not waste memory for large groups.
(*) This was two years ago! I'm getting old
发表评论
-
RAID write back write through
2014-07-09 13:44 960RAID write back指的是raid控制器能够将写 ... -
druid PreparedStatementCache设置
2014-07-08 14:34 3628druid的连接池配置中有PreparedStatement ... -
innodb 插入缓冲
2014-07-01 16:07 709插入缓冲是InnoDB存储引 ... -
Innodb配置,将数据与日志放在不同磁盘可以加快性能
2012-12-06 19:23 753An advanced my.cnf example ... -
character_set_client character_set_connection character_set_results
2012-11-19 20:21 3257之前一直纠结各种编码的却别:character_set_c ... -
amoeba-mysql的安装使用和读写分离(转)
2012-11-16 16:11 1044http://blog.csdn.net/chen861201 ... -
mysqlcheck myisamchk
2012-11-07 17:45 768mysqlcheck的功能类似myisamchk,但其工作不同 ... -
mysqlbinlog乱码
2012-11-06 19:49 5458使用mysqlbinlog查看二进制文件发现 /*!40019 ... -
auto-rehash
2012-11-05 19:20 4148mysql auto-rehash:读取表信息和列信 ... -
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
2012-09-19 20:21 781MySQL主从复制(Master-Slave)与读写分离(My ... -
mysql显示见表语句
2012-09-03 19:13 1192show create table mysql.slow_l ... -
mysql主从同步延迟问题
2012-08-30 14:18 865见http://www.ixpub.net/thread-13 ... -
二进制日志文件
2012-08-29 19:33 1162mysqld在每个二进制日志 ... -
备份恢复数据库
2012-08-28 20:18 838全备份 mysqldump -utest -ptest -- ... -
mysql用户修改密码
2012-08-28 19:37 774mysqladmin -utest -ptest passwo ... -
set session sql_log_bin=0
2012-08-21 15:22 4049引自http://blog.sina.com.cn/s/blo ... -
字符串转换成date
2012-08-15 20:00 934SELECT STR_TO_DATE('Tue 05 June ... -
MySQL DELAY_KEY_WRITE
2012-08-02 20:03 1145MySQL DELAY_KEY_WRITE 引自http:// ... -
Mysql Merge表的优点
2012-07-09 13:52 965在Mysql数据库中,Mysql Me ... -
MySQL线程共享内存参数
2012-07-03 16:48 898MySQL线程共享内存参数 引用 http://mxohy. ...
相关推荐
pku acm 2239 Selecting Courses代码 二分图的最大匹配的匈牙利算法 解题报告请访问:http://blog.csdn.net/china8848
### 选择核特征脸用于每主体只有一个训练样本的人脸识别 #### 概述 本文介绍了一种在每个识别对象仅有一个训练样本的情况下进行人脸识别的新方法。这种方法基于核主成分分析(Kernel Principal Component Analysis,...
在这个系统中,"Course-Selecting-System-master.zip" 是一个包含源代码和相关资源的压缩包,很可能是一个完整的项目仓库。这个系统是用SSM(Spring、SpringMVC、MyBatis)框架开发的,并且采用了LayUI作为前端界面...
Pattern selection methods have been traditionally developed with a dependency on a specific classifier. In contrast, this paper presents a method that selects critical patterns deemed to carry ...
根据给定的文件信息,这份文档是一份NASA提供的详尽报告,名为《Outgassing Data for Selecting Spacecraft Materials》,主要针对航天领域中航天器材料的放气现象提供了大量数据。下面我将详细解释标题和描述中涉及...
illustration of result after selecting security option.
### 《艺术与科学:选择机器人电机的方法》 #### 一、引言 在选择用于移动机器人的驱动电机时,并非简单之事。人们通常通过猜测、试错或他人的建议来选择电机,但这些方法往往导致结果不尽如人意。...
【船级社】 ABS Selecting Design Wave by Long Term Stochastic Method.pdf
在当今的工业设计与优化领域中,模拟仿真技术一直扮演着极其重要的角色。它能够在复杂的工业系统分析中发挥巨大作用,尤其是在无法找到解析解时。仿真不仅在供应链系统、医疗系统和制造系统等领域得到了广泛应用,还...
Selecting the Right Analyses for Your Data_Quantitative, Qualitative, and Mixed © 2014 The Guilford Press A Division of Guilford Publications, Inc
标题 "A Freeware DDX routine for selecting a filename(30KB)" 提供的信息表明,这是一个免费的DDX(Dialog Data Exchange)程序,它的主要功能是帮助用户在对话框中选择文件名。DDX是Microsoft Visual C++中的一...
Models for Selecting an ERP System with HesitantFuzzy Linguistic Information
安装方式要安装Selecting,请执行: npm install selecting 还是Bower: bower install selecting 或者直接从src目录中选择文件。支持的浏览器谷歌浏览器火狐浏览器Internet Explorer 9.0以上苹果浏览器歌剧的iOS ...
《在线毕业设计选题与管理系统》 随着网络技术和办公自动化的飞速发展,信息技术已经渗透到社会各个领域,传统的手工管理方式正逐步被自动化、网络化的管理方式所取代。尤其在教育领域,作为信息化进程的先锋,学校...
Proper treatment of weak subgrade soil ... We proposed an entropy-based multi-criterion group decision analysis method for a group of experts to evaluate alternatives of weak subgrade treatment, with an
标题中的"A Freeware DDX routine for selecting a Directory/Folder(32KB)"指的是一个免费的DDX(Dialog Data Exchange)函数,它专用于在Windows应用程序中选择目录或文件夹。DDX是MFC(Microsoft Foundation ...
静电放电(ESD,Electrostatic Discharge)抑制器是一种关键的电子元件,用于保护敏感的电子设备免受静电放电可能导致的损害。在选择合适的ESD抑制器时,需要考虑多个因素,以确保最佳的保护效果。...