복붙노트

[SQL] 오라클 SQL 쿼리 : 시간을 기준으로 그룹 별 최신 값을 검색 [중복]

SQL

오라클 SQL 쿼리 : 시간을 기준으로 그룹 별 최신 값을 검색 [중복]

나는 오라클 DB에 다음과 같은 테이블이

id     date              quantity
1      2010-01-04 11:00  152
2      2010-01-04 11:00  210
1      2010-01-04 10:45  132
2      2010-01-04 10:45  318
4      2010-01-04 10:45  122
1      2010-01-04 10:30  1
3      2010-01-04 10:30  214
2      2010-01-04 10:30  5515
4      2010-01-04 10:30  210

지금은 ID 당 최신 값 (및 시간)를 검색하고 싶습니다. 출력 예 :

id     date              quantity
1      2010-01-04 11:00  152
2      2010-01-04 11:00  210
3      2010-01-04 10:30  214
4      2010-01-04 10:45  122

난 그냥 쿼리에 그것을 넣어하는 방법을 알아낼 수 없습니다 ...

또한 다음과 같은 옵션이 좋은 것입니다 :

옵션 1 : 쿼리가 마지막 XX 분에서있는 값을 반환해야합니다.

옵션 2 : ID가 ID와 idName에는이있는 다른 테이블에서 텍스트와 연결되어야한다. ID-idName에는 (예 1 testid1) ID의 출력은 다음과 같이 될 것이다.

어떤 도움을위한 많은 감사합니다!

해결법

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

    1.이 데이터를 감안할 때 ...

    이 데이터를 감안할 때 ...

    SQL> select * from qtys
      2  /
    
            ID TS                      QTY
    ---------- ---------------- ----------
             1 2010-01-04 11:00        152
             2 2010-01-04 11:00        210
             1 2010-01-04 10:45        132
             2 2010-01-04 10:45        318
             4 2010-01-04 10:45        122
             1 2010-01-04 10:30          1
             3 2010-01-04 10:30        214
             2 2010-01-04 10:30       5515
             4 2010-01-04 10:30        210
    
    9 rows selected.
    
    SQL>
    

    ... 다음 쿼리는 당신이 원하는 것을 제공합니다 ...

    SQL> select x.id
      2         , x.ts as "DATE"
      3         , x.qty as "QUANTITY"
      4  from (
      5      select id
      6             , ts
      7             , rank () over (partition by id order by ts desc) as rnk
      8             , qty
      9      from qtys ) x
     10  where x.rnk = 1
     11  /
    
            ID DATE               QUANTITY
    ---------- ---------------- ----------
             1 2010-01-04 11:00        152
             2 2010-01-04 11:00        210
             3 2010-01-04 10:30        214
             4 2010-01-04 10:45        122
    
    SQL>
    

    귀하의 추가 요구 사항에 관해서, 당신은 외부 WHERE 절에 추가 필터를 적용 할 수 있습니다. 그것은 다른 테이블처럼 마찬가지로 당신은 인라인 뷰에 테이블을 추가로 가입 할 수 있습니다.

  2. ==============================

    2.여기에 완전한 테스트 예입니다.

    여기에 완전한 테스트 예입니다.

    CREATE TABLE tbl1 (ID NUMBER, dt DATE, quantity NUMBER);
    
    DELETE FROM tbl1;
    insert into tbl1 values (1,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 152);
    insert into tbl1 values (2,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 210);
    insert into tbl1 values (1,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 132);
    insert into tbl1 values (2,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 318);
    insert into tbl1 values (4,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 122);
    insert into tbl1 values (1,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 1);
    insert into tbl1 values (3,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 214);
    insert into tbl1 values (2,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 5515);
    insert into tbl1 values (4,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 210);
    
    SELECT t.ID
         , t.DT
         , t.QUANTITY
      FROM tbl1 t
         ,( SELECT ID
                 , MAX(dt) dt
              FROM tbl1
           GROUP BY ID ) t2
      WHERE t.id = t2.id
        AND t.dt = t2.dt
    

    결과 :

    1   1/4/2010 11:00:00 AM    152
    2   1/4/2010 11:00:00 AM    210
    3   1/4/2010 10:30:00 AM    214
    4   1/4/2010 10:45:00 AM    122
    

    마지막 XX 분의 기록을 얻고 싶은 경우에, 당신은 (나는이 예제에서, 당신이 원하는 무엇이든 함께 500을 대체 500 분을 사용하고 있습니다)이 작업을 수행 할 수 있습니다

       SELECT t.ID
            , t.DT
            , t.QUANTITY
         FROM tbl1 t
            ,( SELECT ID
                    , MAX(dt) dt
                 FROM tbl1
                WHERE dt >= SYSDATE - (500 / 1400)
              GROUP BY ID ) t2
         WHERE t.id = t2.id
           AND t.dt = t2.dt;
    
  3. from https://stackoverflow.com/questions/2000908/oracle-sql-query-retrieve-latest-values-per-group-based-on-time by cc-by-sa and MIT license