2013-05-09 4 views
0

재고 항목의 가격과 수량의 변경 사항을 기록하는 시스템을 관리합니다.날짜 차이에 따라 레코드를 선택하기 위해 sql을 사용합니다

표는 다음과 같이 보일 것이다 :

STOCK(ID, DATE, QUANTITY, PRICE) 

(1, 2013.01.07 00:00, 9, 6) 
(1, 2013.01.02 00:00, 9, 5) 
(1, 2013.01.01 00:00, 10, 5) 
(2, 2013.01.07 22:00, 20, 10) 
(2, 2013.01.07 00:00, 24, 10) 
(3, 2013.01.02 00:00, 9, 5) 
(3, 2013.01.01 00:00, 10, 5) 

항목에 대한 최신 역사 기록 대부분에서 다른 역사 기록에 대한 정보에 대한 정보를 반환해야합니다 일일 기간에 따른 변화를 반환하는 쿼리 (존재하지 않는 경우 또는 자체) 그것에서 일일 :

STOCK(ID, DATE_BEFORE, DATE_AFTER, QUANTITY_BEFORE, QUANTITY_AFTER, PRICE_BEFORE, PRICE_AFTER) 
(1, 2013.01.07 00:00, 2013.01.07 00:00, 9, 9, 6, 6) 
(2, 2013.01.07 00:00, 2013.01.07 22:00, 24, 20, 10, 10) 
(3, 2013.01.01 00:00, 2013.01.02 00:00, 10, 9, 5, 5) 

항목에 대한 최근의 역사를 기록하고 다릅니다 역사 기록에 대한 정보에 대한 정보를 반환해야합니다 일주 동안의 변화를 반환하는 쿼리 기껏해야 7da YS는 (또는 자체가 존재하지 않는 경우)에서 :

STOCK(ID, DATE_BEFORE, DATE_AFTER, QUANTITY_BEFORE, QUANTITY_AFTER, PRICE_BEFORE, PRICE_AFTER) 
(1, 2013.01.01 00:00, 2013.01.07 00:00, 10, 9, 5, 6) 
(2, 2013.01.07 00:00, 2013.01.07 22:00, 24, 20, 10, 10) 
(3, 2013.01.01 00:00, 2013.01.02 00:00, 10, 9, 5, 5) 

나는 그것을 쉬운 주제 아니다 알고이 충분히 분명하다 바랍니다.

귀하의 의견을 기다리면서. 사전에

감사합니다,

H

+0

어떤 데이터베이스를 사용하고 있습니까, 어떤 당신은 지금까지 시도? –

+0

테이블 고유 키 란 무엇입니까? 그리고 그것은 "하루"결과에 대한 ID = 1의 행 2와 3에 대한 출력 행이 누락 된 것처럼 보입니다. – gbn

+0

@Ian Kenney Hello. 나는 극 초음속을 사용하고 있습니다 2.2.9 – user2365532

답변

0

면책 조항 : 나는 극 초음속 SQL 언어에 익숙하지 않은입니다.

다음은 필요한 곳으로 가는데 도움이 될 수 있으며, 원하는 것을 MySQL에서 얻는 것처럼 보입니다.

select subq.*, 
    st_before.quantity QUANTITY_BEFORE, 
    st_after.quantity QUANTITY_AFTER, 
    st_before.price PRICE_BEFORE, 
    st_after.price PRICE_AFTER 
from ( 
    select 
    max_id stock_id, 
    date_before, 
    date_after 
    from 
    (
    SELECT id max_id,max(date) date_after 
    FROM STOCK 
    GROUP BY ID 
) mx 
    join 
    ( 
    SELECT stock.id min_id,min(stock.date) date_before 
    FROM STOCK 
    join (
     SELECT id,max(date) date_after 
     FROM STOCK 
     GROUP BY ID 
    ) mmx 
    on stock.id = mmx.id 
    and datediff(mmx.date_after, stock.date) < 1 
    GROUP BY stock.ID 
) mn 
    on mx.max_id = mn.min_id 
) subq 
    join stock st_before 
    on st_before.id = subq.stock_id 
    and st_before.date = subq.date_before 
    join stock st_after 
    on st_after.id = subq.stock_id 
    and st_after.date = subq.date_after 
    order by stock_id 
; 

sql fiddle

+0

안녕하십니까. 고마워, 잘됐다! – user2365532