• 前段时间找工作参加笔试，笔试题中有一道sql查询语句，条件是两个字段都是最大值，第一直觉是两个字段(例如age、hight)都等于max()，用一个行子查询就行了。第二直觉又不是，如果表中恰好有一age=max(age),hight=...

前段时间找工作参加笔试，笔试题中有一道sql查询语句，条件是两个字段都是最大值，第一直觉是两个字段(例如age、hight)都等于max()，用一个行子查询就行了。第二直觉又不是，如果表中恰好有一条age=max(age),hight=max(hight)的数据，行子查询是没问题的。但是如果age=max(age)的数据hight！=max(hight)并且hight=max(hight)的数据age=！max(age)呢？那么查出来的结果必然是空。
我想首先保证age=max(age)，在age=max(age)的记录里查询hight=max(hight)的记录，这样应该能满足题意了吧？(后来我在其他地方看的题目好像就是要求第一直觉的那样0.0)然后呢？后面就复杂了，查询语句一层一层的嵌套......最后只是大致的草稿出来了，但是笔试时间到，面试官说算了，笔试题不重要......
今天又看到这个问题的一个例子(他是用行子查询做的)，就把这个问题解决了。
mysql> create table maxtest(age int,hight int);
Query OK,0 rows affected (0.27sec)
mysql> insert into maxtest values(30,180);
Query OK,1 row affected (0.05sec)
mysql> insert into maxtest values(30,173);
Query OK,1 row affected (0.06sec)
mysql> insert into maxtest values(32,193);
Query OK,1 row affected (0.06sec)
mysql> insert into maxtest values(23,199);
Query OK,1 row affected (0.06sec)
mysql> select * frommaxtest;+------+-------+
| age | hight |
+------+-------+
| 30 | 180 |
| 30 | 173 |
| 32 | 193 |
| 23 | 199 |
+------+-------+
4 rows in set (0.00sec)
mysql> select * from maxtest where (age,hight)=(select max(age),max(hight) frommaxtest);
Emptyset (0.00sec)
mysql> select * from maxtest where hight=(select max(hight) from (select * from maxtest where age=(select max(age) frommaxtest)) a);+------+-------+
| age | hight |
+------+-------+
| 32 | 193 |
+------+-------+
1 row in set (0.00sec)
java jdbc查询10000次：useTime=22988、24231
另外一种写法：
select * from maxtest where age=(select max(age) from maxtest) and hight=(select max(hight) from (select max(age) from maxtest) a);
这种写法可能更容易理解一些
java jdbc查询10000次：useTime=20527、***

展开全文
• SQL Server provides us with several aggregate functions that can be used to perform different types of calculations on a set of values, and return a single value that summarized the input d...

SQL Server provides us with several aggregate functions that can be used to perform different types of calculations on a set of values, and return a single value that summarized the input data set. These SQL Server aggregate functions include AVG(), COUNT(), SUM(), MIN() and MAX().
SQL Server为我们提供了几个聚合函数，这些函数可用于对一组值执行不同类型的计算，并返回汇总输入数据集的单个值。 这些SQL Server聚合函数包括AVG（），COUNT（），SUM（），MIN（）和MAX（）。
In this article, we will go through the MAX() aggregate function usage and provide multiple examples of the MAX() function usage.
在本文中，我们将介绍MAX（）聚合函数的用法，并提供MAX（）函数用法的多个示例。
用法 (Usage)
SQL MAX() aggregate function is used to return the maximum value from the provided numerical expression or the highest value in the collating sequence from the provided character expression.
SQL MAX（）聚合函数用于从提供的数字表达式返回最大值，或者从提供的字符表达式返回整理序列中的最大值。
句法 (Syntax)
The T-SQL syntax for the MAX() aggregate function is like:
MAX（）聚合函数的T-SQL语法如下：
MAX( [ ALL | DISTINCT ] expression )

Where the ALL option, which is the default option, indicates that the MAX() aggregate function will be applied to all the expression values and the DISTINCT option indicates that each unique value will be considered in the aggregate function, which is not applicable for the MAX() function.
其中ALL选项（默认选项）指示MAX（）聚合函数将应用于所有表达式值，而DISTINCT选项指示将在聚合函数中考虑每个唯一值，不适用于MAX（）函数。
The Expression here can be passed to the MAX() aggregate function can be any numeric, character, uniqueidentifier or DateTime table column, considering that the BIT data type cannot be used with the MAX() aggregate function.
考虑到BIT数据类型不能与MAX（）聚合函数一起使用，此处的表达式可以传递给MAX（）聚合函数，可以是任何数字，字符，uniqueidentifier或DateTime表列。
The MAX() aggregate function can also take a constant value or any arithmetic or string expression, taking into consideration that the MAX() aggregate function will ignore any NULL value in the input expression.
考虑到MAX（）聚合函数将忽略输入表达式中的任何NULL值，MAX（）聚合函数也可以采用常量值或任何算术或字符串表达式。
The value that is returned from the SQL MAX() aggregate function will be the same as the Expression data type, and the returned value will be NULL when the input expression has no rows to read from.
从SQL MAX（）聚合函数返回的值将与Expression数据类型相同，并且当输入表达式没有要读取的行时，返回值将为NULL。
SQL MAX（）聚合函数的示例 (Examples of SQL MAX() aggregate function)
For the SQL MAX() aggregate function demo purposes, let us create a new testing table that contains columns with different data types, such as INT, DECIMAL, NVARCHAR, DATETIME and BIT data types, using the CREATE TABLE T-SQL statement below:
为了实现SQL MAX（）聚合函数演示的目的，让我们使用下面的CREATE TABLE T-SQL语句创建一个新的测试表，其中包含具有不同数据类型的列，例如INT，DECIMAL，NVARCHAR，DATETIME和BIT数据类型：
CREATE TABLE MAXDemo
( ID INT IDENTITY PRIMARY KEY,
EmpName NVARCHAR (100),
EmpDateOfBirth datetime,
EmpSalary Decimal (6,2),
EmpIsActive bit
)

Once the table is created, we will fill that table with the testing data from the AdventureWorks2017 Microsoft testing database tables, using the T-SQL script below:
INSERT INTO MAXDemo
SELECT E.[FName] + E.[SeName] + E.[ThName] + E.[LName] AS EmpName,
E.BirthDate AS EmpDateOfBirth,
EP.Rate AS EmpSalary,
E.SalariedFlag AS EmpIsActive
FROM [HumanResources].[Employee] E
JOIN [HumanResources].[EmployeePayHistory] EP

The test environment is now ready with a table of 316 records.
现在已准备好测试环境，其中包含316条记录的表。
In order to get the maximum value of the ID column, that shows the last added employee, and use it for further analysis or operations, we will use the SQL MAX() aggregate function within a SELECT statement, as in the T-SQL statement below:
为了获得显示最后添加的雇员的ID列的最大值，并将其用于进一步的分析或操作，我们将在SELECT语句中使用SQL MAX（）聚合函数，就像在T-SQL语句中一样下面：
SELECT MAX(ID) AS MaxID
FROM MAXDemo
GO

And the returned value in our demo here will be 316, which is the last added employee ID, as shown below:
在此示例中，返回的值将是316，这是最后添加的员工ID，如下所示：

Another scenario where we need to get the name of the employee who is located at the end of the alphabetical order. This can be achieved by applying the MAX() aggregate function on the EmpName character column, where the MAX() function will sort the EmpName column values based on that column collation, and return the last value, as in the T-SQL statement below:
我们需要获取位于字母顺序末尾的员工姓名的另一种情况。 这可以通过在EmpName字符列上应用MAX（）聚合函数来实现，其中MAX（）函数将基于该列排序对EmpName列值进行排序，并返回最后一个值，如下面的T-SQL语句所示：
SELECT MAX(EmpName) AS LastEmp
FROM MAXDemo

GO

In our case here, the SELECT statement with the SQL MAX() aggregate function will return the last employee, after sorting the employee names. You can imagine it as sorting the names descending then getting the Top 1 employee name, as shown below:
在本例中，带有SQL MAX（）聚合函数的SELECT语句将对雇员名称进行排序后返回最后一个雇员。 您可以想象它是按降序排列的名称，然后获得前1名的雇员姓名，如下所示：

The SQL MAX() aggregate function can also be used with the DateTime data type, where it will sort the DateTime values and return the last value from the sorted results. In our scenario, we need to get the youngest employee with the nearest birthdate. To achieve that, we will pass the EmpDateOfBirth column to the MAX() aggregate function, as in the T-SQL SELECT statement below:
SQL MAX（）聚合函数也可以与DateTime数据类型一起使用，它将对DateTime值进行排序并从排序后的结果中返回最后一个值。 在我们的方案中，我们需要找到最接近生日的最小雇员。 为此，我们将EmpDateOfBirth列传递给MAX（）聚合函数，如下面的T-SQL SELECT语句所示：
SELECT MAX(EmpDateOfBirth) AS YoungestEmp
FROM MAXDemo

GO

The previous SELECT statement with the SQL MAX() aggregate function will sort the employees’ birthdate and return the latest birthdate value. You can imagine the MAX() aggregate function as sorting the employees’ birthdate values descending then getting the Top 1 birthdate, as shown below:
之前带有SQL MAX（）聚合函数的SELECT语句将对雇员的生日进行排序，并返回最新的生日值。 您可以想象MAX（）聚合函数是对雇员的生日日期值进行降序排序，然后获得前1个生日日期，如下所示：

Revamping the salaries scale of the employees can be checked with different types of calculations and aggregate operations including the SQL MAX() aggregate function. This can be done by passing the EmpSalary column to the MAX() function, that will sort all employees salary values and return the largest value from the column, as in the T-SQL Select statement below:
可以使用不同类型的计算和汇总操作（包括SQL MAX（）汇总函数）来检查员工薪资规模的变化。 可以通过将EmpSalary列传递给MAX（）函数来完成，该函数将对所有员工的薪水值进行排序，并从该列返回最大值，如下面的T-SQL Select语句所示：
SELECT MAX(EmpSalary) AS LargestSal
FROM MAXDemo

GO

Executing the previous SELECT statement with the MAX() aggregate function will be similar to the result returned from sorting the employees’ salaries values descending and return the Top 1 salary, with the largest value, as shown below:
使用MAX（）聚合函数执行前一个SELECT语句将类似于对员工的薪水值进行降序排序并返回前1个薪水值（具有最大值）的返回结果，如下所示：

If we try to apply the SQL MAX () aggregate function to the EmpIsActive column, with a BIT data type, as in the T-SQL SELECT statement below:
如果我们尝试将SQL MAX（）聚合函数应用于具有BIT数据类型的EmpIsActive列，如下面的T-SQL SELECT语句所示：
SELECT MAX(EmpIsActive) AS MaxActive
FROM MAXDemo

GO

The SELECT statement execution will fail, with an error message which shows that the data type bit cannot be used with MAX operator, where it does not make any scene to see the maximum value from a bit column, that already has only two values, 1 and 0. The error message will be like below:
SELECT语句执行将失败，并显示一条错误消息，表明该数据类型位不能与MAX运算符一起使用，在该操作中，它不会使任何场景看到位列中的最大值，而该位列已经只有两个值1和0。错误消息将如下所示：

The SQL MAX() aggregate function can be also used within the WHERE clause of a simple SELECT query. This can be achieved by comparing a specific column value with the result returned from a subquery that returned the maximum value of that column, as shown in the T-SQL SELECT query below:
SQL MAX（）聚合函数也可以在简单的SELECT查询的WHERE子句中使用。 这可以通过将特定的列值与子查询返回的结果进行比较来实现，该子查询返回了该列的最大值，如下面的T-SQL SELECT查询所示：
SELECT * FROM MAXDemo
WHERE EmpSalary = ( SELECT MAX(EmpSalary) FROM MAXDemo )

AND EmpIsActive = 1

The previous SELECT query will return all information about the employee whose salary is the largest salary within all employees salary, where it will calculate the maximum value of the employees’ salaries and compare each employee’s salary with that value, as shown below:
前面的SELECT查询将返回有关其薪水是所有员工薪水中最大薪水的员工的所有信息，它将计算员工薪水的最大值并将每个员工的薪水与该值进行比较，如下所示：

We can also use the SQL MAX() aggregate function to return the maximum value of a specific column with other column values, where all non-aggregated columns should be listed in the GROUP BY clause. For example, the SELECT query below will list all employees’ birthdate and salary values and beside each value, it will return the maximum value, in order to compare each value with the maximum value, as shown below:
我们还可以使用SQL MAX（）聚合函数返回具有其他列值的特定列的最大值，其中所有未聚合的列都应在GROUP BY子句中列出。 例如，下面的SELECT查询将列出所有雇员的生日和薪水值，并且在每个值旁边，它将返回最大值，以便将每个值与最大值进行比较，如下所示：
SELECT TOP 10 ID, EmpName, EmpDateOfBirth,
YoungEmp = (SELECT MAX(EmpDateOfBirth) FROM MAXDemo), EmpSalary,
LargeSalary = (SELECT MAX(EmpSalary) FROM MAXDemo )
FROM MAXDemo
WHERE EmpIsActive = 1
GROUP BY ID, EmpName, EmpDateOfBirth , EmpSalary

ORDER BY EmpSalary DESC

And the result, that can be easily compared together, will be as below:
结果，可以很容易地比较在一起，结果如下：

We can also filter the previous query result set to return only the employees with a very large salary variation from the maximum salary values, by providing an additional condition using the SQL MAX() aggregate function within the HAVING clause, as shown below:
通过使用HAVING子句中SQL MAX（）聚合函数提供附加条件，我们还可以过滤以前的查询结果集，以仅返回与最大薪水值相差很大的薪水的雇员，如下所示：
SELECT TOP 10 ID, EmpName, EmpDateOfBirth,
YoungEmp = (SELECT MAX(EmpDateOfBirth) FROM MAXDemo), EmpSalary,
LargeSalary = (SELECT MAX(EmpSalary) FROM MAXDemo )
FROM MAXDemo
WHERE EmpIsActive = 1
GROUP BY ID, EmpName, EmpDateOfBirth , EmpSalary
HAVING ((SELECT MAX(EmpSalary) FROM MAXDemo)- EmpSalary) > 100

ORDER BY EmpSalary DESC

And the result of executing the previous query will be like:
执行上一个查询的结果将类似于：

Let us add a new column to the demo table without filling any value in that column, using the ALTER TABLE T-SQL statement below:
让我们使用下面的ALTER TABLE T-SQL语句在演示表中添加一个新列，而不填充该列中的任何值：
ALTER TABLE MAXDemo ADD AllowanceValue INT NULL

After adding the new column, if we try to run the below query to get the maximum allowance value from all company employees using the SQL MAX() aggregate function:
添加新列后，如果我们尝试运行以下查询以使用SQL MAX（）聚合函数从所有公司员工那里获得最大津贴额：
SELECT MAX(AllowanceValue) As MaxAllowance FROM MAXDemo

The returned result will be NULL, as the table has no value in that column, as shown below:
返回的结果将为NULL，因为该列中的表没有值，如下所示：

结论 (Conclusion)
It is clear from these above examples, how we can use the SQL MAX() aggregate function to achieve a specific goal in different scenarios, with different data types, and within any T-SQL query.
从上面的这些示例可以清楚地看出，我们如何在不同的场景中，如何使用不同的数据类型以及在任何T-SQL查询中使用SQL MAX（）聚合函数来实现特定的目标。

翻译自: https://www.sqlshack.com/sql-server-max-aggregate-function/


展开全文
• 在针对某个类型数据存在多条时，但只想取最新的一条。在可以确定时哪种类型时我们使用简单sql就可以解决。 ORACLE-SQL： 如: select * from ( select * from t_table a where a.tpye=? order by a.time desc ) ...
业务场景：
ORACLE可以查看：https://blog.csdn.net/qq_25223941/article/details/109358683
MYSQL可以查看：https://blog.csdn.net/qq_25223941/article/details/109358496
在针对某个类型数据存在多条时，但只想取最新的一条。在可以确定时哪种类型时我们使用简单sql就可以解决。
ORACLE-SQL：
如: select * from ( select * from t_table a where a.tpye=? order by a.time desc ) where rownum=1;
MYSQL-SQL:
如： select * from t_table a where a.type=?  order by time desc limit1;
但是在我们不确定时哪种类型时，需要全表扫描或者多数据扫描时，就需要用到oracle中特有的函数解决了。
ORACLE-SQL：
如：select * from (select  a.type,row_number() over(partition by a.type order by a.time desc) as rn from t_table a where xxxx) where rn=1;
MYSQL-SQL：
如：select a.type,max(id) from( select * from t_table  order by time desc ) a group by a.type;
或者： select * from t_table order by time desc limit 1;
其中partition by后面跟的字段表示根据此字段去区分跟分组，order by 进行排序，row_number() over 这个表示根据里面的条件去获取行数，
总结这个函数的意思：根据type字段分组根据time字段排序后，获取此type在表中存在多少数据（存在多少则表示rn有多少行）rn=1表示取第一行也就拿到了最新的数据。
展开全文
• 最近工作时, 遇到了这样一个情况, 多条历史记录,将最近一条数据查询出来. sql select * from tb_splc a where createtime=(select max(createtime) from tb_splc b where b.xchsid=a.xchsid ) 备注: 以上是...
娱乐一下

【喵星人】+豆芽洗澡被偷拍！！！

查最近一条数据SQL
娱乐一下
背景sql小结

背景
最近工作时, 遇到了这样一个情况, 多条历史记录,将最近一条数据查询出来.
sql
select * from tb_splc  a where createtime=(select max(createtime) from tb_splc  b  where b.xchsid=a.xchsid )

备注: 以上是postgresql写的
小结
小伙伴们get到了么,小编出一个问题, 如果查时间最长的那条记录, 怎么写呢,如果您愿意可以在评论区写出您的答案呀,其实很简单呀.
展开全文
• 如何在一条sql中，对数据表中的数据进行分组，同时求每组最大(小)值。 / 正文 / 测试案例 求每个班级中的年龄最大的学生 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- --------------------------....
• 有5数据，我只想要id=163的最新数据 两种方法： 1、SELECT * FROM fp_studentItem where id=( SELECT MAX(id) FROM fp_studentItem where studentid=1)  子查询查询最大的id（不怎么推荐） 2、SELECT * FROM ...
• Max 用法 正常用法： select offid,max(time2) from 表 A group by offid B 经常遇到，表名：tmp.testtable 想变成： select a.* from tmp.testtable a inner join (select usercode,max(time2)maxtime from tmp....
• 480B-900D-05597322018A' and Recipient=t.Recipient for xml path('')), 1, 0, '') from mtMeetLists --将某条记录内的Attchment拆分获取多条记录并拼成A标签返回 Attchment原内容格式：|07_02_10-04-22项目分工....
• 同一个站点下有个项目，其中一个项目的页面空白，且后台报错如下： 2018-08-23 15:38:52,811 [66] ERROR logerror - 【Error】:System.Data.Entity.Core.EntityCommandExecutionException: An error occurred ...
• SELECT news_info.id , news_info.title FROM news_info WHERE (news_info.id >= ((SELECT MAX(id) FROM news_info)-(SELECT MIN(id) FROM news_info)) * RAND() + (SELECT MIN(id) FROM news_info)) AND news_info.
• 用projectid 作为分组并按id排序，获取最新一数据。 oracle 、 mysql 用法 select * from ( select row_number() over(partition by ProjectID order by [ID] desc ) as keyId,* from table ) as t where t....
• --四、按name分组随机取一数据。 select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name /* name val memo ---------- ----------- ---------...
• 这时候可能需要我们踢出这些有差别的数据，即两条或多条记录中只保留一项。 如下：表timeand 针对time字段相同时有不同total和name的情形，每当遇到相同的则只取其中一条数据，最简单的实现方法有两种 1...
• 前几天去参加一场面试，面试过程中有被问到一个SQL语句的问题，很遗憾没有回答上来，结果一面直接挂（问完这个问题后，当我听到面试官对我说:你有什么想问我的吗？ 我的内心一片凉凉）。 其实面试官问的问题听起来...
• 如果遇到 SELECT * FROM a AS a LEFT JOIN b AS b ON a.bid=b.id ...这段Sql由于d表有多条关于a的数据时，会出现原本只有一条数据，变成多条数据， 这是因为在联b表时，没有加AND限制，可改写成：...
• 这时候可能需要我们踢出这些有差别的数据，即两条或多条记录中只保留一项。 如下：表timeand 针对time字段相同时有不同total和name的情形，每当遇到相同的则只取其中一条数据，最简单的实现方法有两种 1、...
• declare @i varchar(max) --声明一个变量作为循环条件-- set @i=1 while @i&lt;79 --执行次数，这里执行78次 -- begin insert INTO Traffic_Info(TrafficId,DepartCode,Status,Seq) --Traffic_Info 为表名字、...
• 1、DECLARE @AA VARCHAR(MAX)SET @AA = ( ...' FROM A WITH(NOLOCK) FOR XML PATH('') )SELECT @AA2、DECLARE @AA VARCHAR(MAX)SET @AA = '' -- 必须赋初始值（sql中的null加上任何值都是null）SELECT @AA = @AA
• 在针对某个类型数据存在多条时，但只想取最新的一条。在可以确定时哪种类型时我们使用简单sql就可以解决。 如： select * from t_table a where a.type=? order by time desc limit1; 但是在我们不确定时哪种...
• --(正常效果) select l.* from loadCurveSampling l left join Meter m on l.meter_id=m.Meter_ID --聚合当天最大值数据记录 合并查询(聚合效果) ...(select meter_id,MAX(DT) DT from Lo...
• 1 数据库中有如下的数据，想取不同ID对应的日期为最大日期的记录 SELECT * FROM My_Table A ...SELECT MAX(B.LEASERENTDETAIL_ID) FROM My_Table B GROUP BY B.LEASECONTRACT_ID ,TO_CHAR(B.
• 用到SQL中的LEFT JOIN时，在右表中存在多条记录，即一对多的情况时， 表结构与数据： CREATE TABLE image ( id int(11) NOT NULL AUTO_INCREMENT, productId int(11) DEFAULT NULL, name varchar(255) ...
• ![图片说明]... 原先用 select key,max(value) from tbl group by key 查询出的结果，但是我要再多加一个TEST字段 应该怎么写SQL？性能尽可能好一点的。感谢
• 这篇文章将介绍一个sql的实用技巧，就是max函数和count函数的复合使用，来直接求得COUNT(*)的最大值。这个技巧在很场合都会需要使用，而我自己探索发现这个技巧的契机则是我的sql课程的某一道练习题，那么就让我们...
• 在数据库应用项目开发中，经常会使用一些二进制的图像数据，存储和读取显示图像数据主要采用的是路径链接法和内存流法。路径链接法是将图像文件保存在固定的路径下，数据库中只...本文主要讨论通过SQL Server 200...
• SQL code问题描述： 无论是在sql 2000，还是在 sql 2005 中,都没有提供字符串的聚合函数， 所以，当我们在处理下列要求时，会比较麻烦： 有表tb, 如下： id value ----- ------ 1 aa 1 bb 2 aaa 2 bbb 2 ccc 需要...
• 1：在配置文件中不需要指定wall防火墙filter。 配置如下： spring: datasource: ... url: jdbc:mysql://localhost: ...zeroDateTimeBehavior=convertToNull...//允许一次执行多条语句 return wallConfig; } } }
• select @M=max(id) from t_test while @M>0  begin   declare @a varchar (200)  ,@b varchar(20)  select @a=id,@b=LongField from t_test where id =@M   insert into t_test1(id,ShortField) ...
• max（）： 通过一含有max（）的语句来了解一下通过索引来优化带有max（）方法的SQL语句。 SELECT MAX(payment_date) FROM payment; 用explain关键字分析得出：这是一个简单的（SIMPLE）查询，type是最差的类型...

...