1

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

つまり、これは倉庫内で移動された数量であり、問​​題は、すべてのアイテムの特定の時間の在庫を取得するクエリを作成しようとしているため、受信と返品が同時に行われた最初の2行にあります。 。私は使用max(date)していますが、結果に適切な量が得られません。

4

3 に答える 3

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
于 2013-01-17T22:24:17.593 に答える
2

SQL-Server 2012を使用している場合、これらはいくつかの優れた機能が追加されています。

LAST_VALUE-または-関数をまたはウィンドウフレームFIRST_VALUE()と組み合わせて使用​​できます(句を参照)。ROWSRANGEOVER

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
于 2013-01-17T23:12:12.390 に答える
0

where句を追加して、合計を実行します。

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

希望の日時に日付を入力する場合は、その日が始まる真夜中になることを忘れないでください。

于 2013-01-17T22:34:42.947 に答える