반응형
Oracle SQL 쿼리: 시간을 기준으로 그룹별 최신 값 검색
Oracle 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와 ID 이름을 가진 다른 테이블의 텍스트와 연결되어야 합니다.그러면 id에 대한 출력은 id-idname(예: 1-testid1)과 같아야 합니다.
도움을 주셔서 감사합니다!
이 데이터를 고려하면...
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 절에 추가 필터를 적용할 수 있습니다.마찬가지로 다른 테이블과 마찬가지로 추가 테이블을 인라인 뷰에 조인할 수 있습니다.
여기 완전하고 검증된 예가 있습니다.
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;
언급URL : https://stackoverflow.com/questions/2000908/oracle-sql-query-retrieve-latest-values-per-group-based-on-time
반응형
'programing' 카테고리의 다른 글
유형 스크립트의 열거형 대 상수 차이 (0) | 2023.06.08 |
---|---|
문자 배열의 null 종료 (0) | 2023.06.08 |
로컬 인덱스별 페이징을 위한 Oracle 계획에 파티션당 STOPKEY가 없습니다. (0) | 2023.06.08 |
'임의' 유형에 대한 유형 스크립트 검사 (0) | 2023.06.08 |
dbms_output을 사용합니다..sql 파일에 대한 Datagrip에 put_line (0) | 2023.06.08 |