2013-05-09 84 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) 

返回超过1天的时间内改变应该返回信息的最新历史记录的项目,并为不同的最多的历史记录信息的查询从它1天(或本身如果都没有):

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) 

返回在1周时间内的变化应该返回信息的最新历史记录的项目和历史记录中的不同信息的查询最多7 da (或者本身如果没有):

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

的数据库您使用的,什么你尝试过这么远吗? – 2013-05-09 09:14:49

+0

什么是表格唯一键?并且它看起来像缺少ID = 1的第2行和第3行的“一天”结果的输出行 – gbn 2013-05-09 09:16:01

+0

@Ian Kenney您好。我正在使用超音速2.2.9 – user2365532 2013-05-09 09:39:52

回答

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 2013-05-10 08:29:20