简体   繁体   English

SQL - 如何选择具有最大值列的行

[英]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 

i need to query for the row having max(value)(ie 60). 我需要查询具有max(value)的行(即60)。 So, here we get two rows. 所以,这里我们得到两行。 From that, I need the row with the lowest time stamp for that day(ie 18/5/2010, 3 pm -> 60) 从那时起,我需要当天最低时间戳的行(即2010年5月18日,下午3点 - > 60)

Keywords like TOP, LIMIT, ROWNUM, ...etc are database dependent. TOP,LIMIT,ROWNUM等关键字依赖于数据库。 Please read this article for more information. 请阅读本文以获取更多信息。

http://en.wikipedia.org/wiki/Select_(SQL)#Result_limits http://en.wikipedia.org/wiki/Select_(SQL)#Result_limits

Oracle: ROWNUM could be used. Oracle:可以使用ROWNUM。

select * from (select * from table 
order by value desc, date_column) 
where rownum = 1;

Answering the question more specifically: 更具体地回答这个问题:

select high_val, my_key
from (select high_val, my_key
      from mytable
      where something = 'avalue'
      order by high_val desc)
where rownum <= 1

Analytics! 分析! This avoids having to access the table twice: 这样可以避免两次访问表:

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;

Answer is to add a having clause: 答案是添加一个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)

this should work and gets rid of the neccesity of having an extra sub select in the date clause. 这应该工作,并摆脱在日期子句中有一个额外的子选择的必要性。

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.

Regards, Rob. 问候,Rob。

Technically, this is the same answer as @Sujee. 从技术上讲,这与@Sujee的答案相同。 It also depends on your version of Oracle as to whether it works. 它还取决于您的Oracle版本是否有效。 (I think this syntax was introduced in Oracle 12??) (我认为这个语法是在Oracle 12中引入的??)

SELECT *
FROM   table
ORDER BY value DESC, date_column ASC
FETCH  first 1 rows only;

As I say, if you look under the bonnet, I think this code is unpacked internally by the Oracle Optimizer to read like @Sujee's. 正如我所说,如果你看一下发动机罩,我认为这个代码在内部被Oracle Optimizer解压缩,就像@ Sujee一样。 However, I'm a sucker for pretty coding, and nesting select statements without a good reason does not qualify as beautiful!! 但是,我是一个漂亮编码的傻瓜,没有充分理由嵌套select语句不符合美观! :-P :-P

In Oracle: 在Oracle中:

This gets the key of the max(high_val) in the table according to the range. 这将根据范围获取表中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

In Oracle DB: 在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

The simplest answer would be 最简单的答案是

--Setup a test table called "t1" - 设置一个名为“t1”的测试表

create table t1
(date datetime,
value int)

-- Load the data. - 加载数据。 -- Note: date format different than in the question - 注意:日期格式与问题不同

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 

-- find the row with the max qty and min date. - 找到具有最大数量和最小日期的行。

select *
from t1
where value = 
    (select max(value)  from t1)
and date = 
    (select min(date) 
    from t1
    where value = (select max(value)  from t1))

I know you can do the "TOP 1" answer, but usually your solution gets just complicated enough that you can't use that for some reason. 我知道你可以做到“TOP 1”的答案,但通常你的解决方案变得足够复杂,你不能出于某种原因使用它。

You can use this function, ORACLE DB 您可以使用此功能,ORACLE DB

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM