【发布时间】:2019-03-16 08:21:31
【问题描述】:
我有以下数据:
DECLARE @t TABLE (usr VARCHAR(100), dt DATE, amount INT);
INSERT INTO @t VALUES
('a', '2018-01-01', 100), -- 100
('a', '2018-02-01', 100), -- 200
('a', '2018-03-01', 100), -- 300
('a', '2018-04-01', 100), -- 400
('a', '2018-05-01', 100), -- 500
('b', '2018-01-01', 150), -- 150
('b', '2018-02-01', 150), -- 300
('b', '2018-03-01', 150), -- 450
('b', '2018-04-01', 150), -- 600
('b', '2018-05-01', 150); -- 750
还有一个值,例如 300 或 301(用户变量或列)。我想选择行,直到运行总金额达到指定值,具有以下扭曲:
- 对于 300,我想为 a 选择前 3 行,为 b 选择前 2 行
- 对于 301,我想为 a 选择前 4 行,为 b 选择前 3 行
这应该很简单,但我找到的解决方案不能处理第二种情况。
【问题讨论】:
-
金额如何从 100 变为 150?你是怎么得到 300/301 的?细节缺失。
-
amount是否保证为非负数?即运行总数永远不会下降? -
@MartinSmith 很有趣。假设它始终是正值,但如果它也处理负值,则为奖励。
-
您需要定义应该如何处理。它应该只返回所有行,直到运行总数首次达到 300 或后续行,如果总数再次低于该值
-
@MartinSmith 假设它是贪婪的,即选择尽可能多的行。
标签: sql sql-server sql-server-2012 window-functions