![](/img/trans.png)
[英]SQL - How to select a row having a column with max value (+ group by)
[英]SQL - How to select a row having a column with max value
date value
18/5/2010, 1 pm 40
18/5/2010, 2 pm 20
18/5/2010, 3 pm 60
18/5/2010, 4 pm 30
18/5/2010, 5 pm 60
18/5/2010, 6 pm 25
我需要查询具有max(value)的行(即60)。 所以,这里我们得到两行。 从那时起,我需要当天最低时间戳的行(即2010年5月18日,下午3点 - > 60)
TOP,LIMIT,ROWNUM等关键字依赖于数据库。 请阅读本文以获取更多信息。
http://en.wikipedia.org/wiki/Select_(SQL)#Result_limits
Oracle:可以使用ROWNUM。
select * from (select * from table
order by value desc, date_column)
where rownum = 1;
更具体地回答这个问题:
select high_val, my_key
from (select high_val, my_key
from mytable
where something = 'avalue'
order by high_val desc)
where rownum <= 1
分析! 这样可以避免两次访问表:
SELECT DISTINCT
FIRST_VALUE(date_col) OVER (ORDER BY value_col DESC, date_col ASC),
FIRST_VALUE(value_col) OVER (ORDER BY value_col DESC, date_col ASC)
FROM mytable;
答案是添加一个having子句:
SELECT [columns]
FROM table t1
WHERE value= (select max(value) from table)
AND date = (select MIN(date) from table t2 where t1.value = t2.value)
这应该工作,并摆脱在日期子句中有一个额外的子选择的必要性。
SQL> create table t (mydate,value)
2 as
3 select to_date('18/5/2010, 1 pm','dd/mm/yyyy, hh am'), 40 from dual union all
4 select to_date('18/5/2010, 2 pm','dd/mm/yyyy, hh am'), 20 from dual union all
5 select to_date('18/5/2010, 3 pm','dd/mm/yyyy, hh am'), 60 from dual union all
6 select to_date('18/5/2010, 4 pm','dd/mm/yyyy, hh am'), 30 from dual union all
7 select to_date('18/5/2010, 5 pm','dd/mm/yyyy, hh am'), 60 from dual union all
8 select to_date('18/5/2010, 6 pm','dd/mm/yyyy, hh am'), 25 from dual
9 /
Table created.
SQL> select min(mydate) keep (dense_rank last order by value) mydate
2 , max(value) value
3 from t
4 /
MYDATE VALUE
------------------- ----------
18-05-2010 15:00:00 60
1 row selected.
问候,Rob。
从技术上讲,这与@Sujee的答案相同。 它还取决于您的Oracle版本是否有效。 (我认为这个语法是在Oracle 12中引入的??)
SELECT *
FROM table
ORDER BY value DESC, date_column ASC
FETCH first 1 rows only;
正如我所说,如果你看一下发动机罩,我认为这个代码在内部被Oracle Optimizer解压缩,就像@ Sujee一样。 但是,我是一个漂亮编码的傻瓜,没有充分理由嵌套select
语句不符合美观! :-P
在Oracle中:
这将根据范围获取表中max(high_val)的关键字。
select high_val, my_key
from (select high_val, my_key
from mytable
where something = 'avalue'
order by high_val desc)
where rownum <= 1
在Oracle DB中:
create table temp_test1 (id number, value number, description varchar2(20));
insert into temp_test1 values(1, 22, 'qq');
insert into temp_test1 values(2, 22, 'qq');
insert into temp_test1 values(3, 22, 'qq');
insert into temp_test1 values(4, 23, 'qq1');
insert into temp_test1 values(5, 23, 'qq1');
insert into temp_test1 values(6, 23, 'qq1');
SELECT MAX(id), value, description FROM temp_test1 GROUP BY value, description;
Result:
MAX(ID) VALUE DESCRIPTION
-------------------------
6 23 qq1
3 22 qq
最简单的答案是
- 设置一个名为“t1”的测试表
create table t1
(date datetime,
value int)
- 加载数据。 - 注意:日期格式与问题不同
insert into t1
Select '5/18/2010 13:00',40
union all
Select '5/18/2010 14:00',20
union all
Select '5/18/2010 15:00',60
union all
Select '5/18/2010 16:00',30
union all
Select '5/18/2010 17:00',60
union all
Select '5/18/2010 18:00',25
- 找到具有最大数量和最小日期的行。
select *
from t1
where value =
(select max(value) from t1)
and date =
(select min(date)
from t1
where value = (select max(value) from t1))
我知道你可以做到“TOP 1”的答案,但通常你的解决方案变得足够复杂,你不能出于某种原因使用它。
public string getMaximumSequenceOfUser(string columnName, string tableName, string username)
{
string result = "";
var query = string.Format("Select MAX ({0})from {1} where CREATED_BY = {2}", columnName, tableName, username.ToLower());
OracleConnection conn = new OracleConnection(_context.Database.Connection.ConnectionString);
OracleCommand cmd = new OracleCommand(query, conn);
try
{
conn.Open();
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
result = dr[0].ToString();
dr.Dispose();
}
finally
{
conn.Close();
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.