我一直在阅读有关过滤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 :(得分: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
答案 1 :(得分:2)
如果您使用的是SQL-Server 2012,则可以添加几个不错的功能。
您可以将 LAST_VALUE
- 或FIRST_VALUE()
- 函数与ROWS
或RANGE
窗口框架结合使用(请参阅< strong> 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
答案 2 :(得分:0)
添加where
子句并进行求和:
select item, sum([quantity moved])
from t
group by item
where t.date <= @DESIREDDATETIME
如果您为所需的日期时间输入日期,请记住当天开始时的午夜。