복붙노트

[SQL] SQL은 - 어떻게 최대 값을 가진 열을 갖는 행을 선택합니다

SQL

SQL은 - 어떻게 최대 값을 가진 열을 갖는 행을 선택합니다

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 

난 맥스 (값)를 갖는 로우 (즉. 60)에 대해 질의를해야한다. 그래서, 여기에 우리는 두 행을 얻을. (-> 60 즉 18/5/2010 오후 3시) 그에서, 나는 그 날의 가장 낮은 타임 스탬프 행이 필요

해결법

  1. ==============================

    1.등 TOP, LIMIT, ROWNUM, ... 등의 키워드는 데이터베이스에 따라 달라집니다. 자세한 내용은이 문서를 읽어 보시기 바랍니다.

    등 TOP, LIMIT, ROWNUM, ... 등의 키워드는 데이터베이스에 따라 달라집니다. 자세한 내용은이 문서를 읽어 보시기 바랍니다.

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

    오라클 : 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
    
  2. ==============================

    2.해석학! 이 두 번 테이블에 액세스하는 것을 방지 :

    해석학! 이 두 번 테이블에 액세스하는 것을 방지 :

    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;
    
  3. ==============================

    3.답변 HAVING 절을 추가하는 것입니다 :

    답변 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)
    

    이 일을해야하며, 별도의 서브 날짜 절에서 선택한 가질 필요를 제거한다.

  4. ==============================

    4.

    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.
    

    문안 인사, 롭.

  5. ==============================

    5.기술적으로,이 @Sujee과 같은 대답이다. 또한 작동 여부에 오라클의 버전에 따라 달라집니다. (나는이 구문은 오라클 (12)에 도입 된 생각 ??)

    기술적으로,이 @Sujee과 같은 대답이다. 또한 작동 여부에 오라클의 버전에 따라 달라집니다. (나는이 구문은 오라클 (12)에 도입 된 생각 ??)

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

    내가 말하는대로 보닛 아래에 보면,이 코드는 Sujee의 @처럼 읽을 내부적으로 오라클 최적화하여 압축을 푼 생각합니다. 그러나, 나는 꽤 코딩 빠는 해요, 그리고 좋은 이유없이 선택 문을 중첩하는 것은 아름다운 자격을하지 않습니다! :-피

  6. ==============================

    6.오라클의 경우 :

    오라클의 경우 :

    이 범위에있어서, 테이블의 최대 (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
    
  7. ==============================

    7.오라클 DB의 경우 :

    오라클 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
    
  8. ==============================

    8.가장 간단한 대답은 것

    가장 간단한 대답은 것

    "T1"라는 테스트 테이블을 --Setup

    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"답을 할 수있는 알고 있지만, 일반적으로 솔루션은 당신이 어떤 이유로 것을 사용할 수 없다는 것을 충분히 복잡해진다.

  9. ==============================

    9.

     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;
        }
    
  10. from https://stackoverflow.com/questions/2854257/sql-how-to-select-a-row-having-a-column-with-max-value by cc-by-sa and MIT license