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

所以这是在仓库中移动的数量,问题出在前两行同时是接收和返回,因为我正在尝试进行查询,以在给定时间为我提供所有物品的库存. 我使用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()- 函数与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
于 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 回答