2013-01-17 131 views
1

我一直在閱讀有關過濾SQL查詢的許多主題,但似乎沒有一個適用於我的案例,所以我需要一些幫助。我在SQL表上有以下數據。SQL查詢中的多個過濾器

Date     item  quantity moved quantity in stock sequence 

13-03-2012 16:51:00 xpto   2      2   1 
13-03-2012 16:51:00 xpto  -2      0   2 
21-03-2012 15:31:21 zyx   4      6   1 
21-03-2012 16:20:11 zyx   6      12   2 
22-03-2012 12:51:12 zyx   -3      9   1 

因此,這是量在倉庫中移動,問題是這是一個前臺,並在同一時間返回前兩排,因爲我想做一個查詢這使我的股票在所有項目的給定時間。我使用max(date)但我沒有得到正確數量的結果。

+0

您正在使用什麼RDBMS? – Quassnoi

+0

聽起來像你想'SUM(「數量移動」)'來獲得你當時的總量? –

+0

這是MS SQL服務器 –

回答

5
SELECT item, qty_in_stock 
FROM (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY item ORDER BY item_date DESC, sequence DESC) rn 
     FROM mytable 
     WHERE item_date <= @date_of_stock 
     ) q 
WHERE rn = 1 
+0

WHERE item_date <= @date_of_stock,我不明白這個部分,只有一個日期,這就是項目被移入或移出的日期。 –

+0

@Dinarte:「在給定的時間給我所有物品的庫存查詢」。 '@ date_of_stock'是參數,即「給定時間」。 – Quassnoi

+0

+1。 。 。這是正確的答案。我回答時沒有注意到庫存數量。 –

0

添加where條款,並做總結:

select item, sum([quantity moved]) 
from t 
group by item 
where t.date <= @DESIREDDATETIME 

如果你把日期爲所需日期時間,記住這一天開始的時候去午夜。

2

如果您使用的是SQL-Server 2012,則會添加一些不錯的功能。

可以使用LAST_VALUE - 或FIRST_VALUE() - 功能,結合一個ROWSRANGE窗框(見OVER條款):

SELECT DISTINCT 
    item, 
    LAST_VALUE(quantity_in_stock) OVER (PARTITION BY item 
             ORDER BY date, sequence 
             ROWS BETWEEN UNBOUNDED PRECEDING 
               AND UNBOUNDED FOLLOWING) 
      AS quantity_in_stock 
FROM tableX 
WHERE date <= @date_of_stock