2010-01-04 7 views
12

에 따라 그룹별로 최신 값을 검색 I 오라클 DB오라클 SQL 쿼리 : 시간

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에 대한 출력은 다음과 같아야합니다 : id-idname (예 : 1-testid1).

도움을 주셔서 감사합니다.

+0

주어진 'ID'에 대해 '날짜'가 고유합니까? – APC

+0

타임 스탬프는 고유해야하지만 사용할 수있는 데이터에 포함되어 있지 않으므로 솔루션은 관계없이 작동해야합니다. – Tom

답변

21

...

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> 
,363,210

은 ... 다음 쿼리는 WHERE 절 귀하의 추가 요구 사항에 관해서

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> 

, 당신은 외부에 추가 필터를 적용 할 수 있습니다 ... 당신이 원하는 것을 제공합니다. 마찬가지로 다른 테이블과 마찬가지로 추가 테이블을 인라인보기에 조인 할 수 있습니다.

+0

감사합니다. 기본 쿼리가 정상적으로 작동합니다. 단지 타임 스탬프가 항상 고유하지는 않다는 것을 알았 기 때문에 ID마다 여러 항목이 있지만 처음에 DISTINCT를 추가하면 도움이되었습니다. 지금 추가 옵션을 시도 할 것입니다. – Tom

+0

DISTINCT를 내부 또는 외부 선택에 추가하는 것이 성능면에서 더 좋을까요? – Tom

+0

DISTINCT는 우연히'quantity' 값이 최대'date' 값과 일치하지 않으면 얻은 결과를 변경하지 않습니다. 적절한 비즈니스 규칙이 무엇인지 알아 내서 적용해야합니다. 가능성은'max (quantity)','min (quantity)'또는'avg (quantity)'를 포함 할 수 있지만 가능한 많은 결의가있다. – APC

6

다음은 완전한 테스트를 거친 예제입니다.

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; 
+0

나는 당신의 대답에 대해서도 표를 던졌고, 나는 다른 성명의 구문을 선호한다. – Tom