2014-05-21 3 views
0

(더 큰 select 문을 사용하여) 항목의 최신 가격을 가져와야 할 필요가 있습니다. 알아낼 수 없습니다.하나의 값을 어디서 최신 날짜로 가져 오기

테이블 : 상기 실시 예 2에 따라 아이템을 찾을 때 항목 1, '13'를 찾을 때

ITEMID DATE  SALEPRICE 
1   1/1/2014 10 
1   2/2/2014 20 
2   3/3/2014 15 
2   4/4/2014 13 

I가 '20'로 선택의 출력이 필요하다.

나는 Oracle SQL을 사용하고 있습니다.

+0

사용자 row_number, rank, dense_rank을 입력하십시오. 자세한 내용은 아래 링크를 확인하십시오. http://jayeshgoyani.blogspot.in/2012/11/denserank-rank-and-rownumber.html –

+0

정확한 답변을 제공하지 않기 때문에 댓글에이 글을 추가 한 것이지만 문제 해결에 도움이됩니다. . –

+0

@MikeW : 코드는 실제로 다양한 DBMS에서 작동합니다. MySQL은 윈도우 기능을 지원하지 않는 유일한 (서버) DBMS이다. 유일한 비표준 부분은 식별자 ('# Department'는 SQL 표준에서 유효한 식별자가 아닙니다)이며 따옴표 (괄호는 식별자가 아니라 SQL 식별자에 사용됩니다) –

답변

1

(내 생각에) 가장 읽기/이해 SQL이 될 것이다 :

select salesprice from `table` t 
where t.date = 
(
    select max(date) from `table` t2 where t2.itemid = t.itemid 
) 
and t.itemid = 1 -- change item id here; 

가정 테이블의 이름입니다 table이며 하루에 하나의 가격과 항목 만 있습니다. (그렇지 않으면 where 조건은 항목 당 둘 이상의 행과 일치합니다). 또는 subselect는 자체 조인으로 작성 될 수 있습니다 (성능을 변경해서는 안 됨).

다른 답변으로 사용 된 OVER/PARTITION에 대해 확실하지 않습니다. 어쩌면 DBMS에 따라 성능을 최적화 할 수 있습니다.

1

보십시오! 당신이 date에 의해 주문대로 sql-server에서

Oracle sql

select * from 
(
select *,rn=row_number()over(partition by ITEMID order by DATE desc) from table 
)x 
where x.rn=1 

에서 작동 할 수 그런 다음, 각각의 그룹은 RN을 얻을 것이다 ROW_NUMBER()는 파티션 항목 ID로 모든 기록에 number을 할당해야 내림차순 최신 기록을 얻을 수

SEE DEMO

1

아마 이런 식으로 뭔가 :

테스트 데이터

DECLARE @tbl TABLE(ITEMID int,DATE DATETIME,SALEPRICE INT) 
INSERT INTO @tbl 
VALUES 
(1,'1/1/2014',10), 
(1,'2/2/2014',20), 
(2,'3/3/2014',15), 
(2,'4/4/2014',13) 

쿼리

;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY ITEMID ORDER BY [DATE] DESC) AS rowNbr, 
     tbl.* 
    FROM 
     @tbl AS tbl 
) 
SELECT 
    * 
FROM 
    CTE 
WHERE CTE.rowNbr=1 
관련 문제