在获取此图片的“标记”和“左”列时,我需要帮助。我尝试了CTE和滞后功能,但似乎没有任何效果。
如果我在表中有前四列,该如何计算“收货”和“左”列。
基本上,对于每个组来说,“收起”和“离开”的方式基本上是最大的,我们可以从中取出第4列。必须按照A,B,C,D的顺序取出它们。
让我知道是否有问题,我会尽力回答。
谢谢
因为人们要的是给定的记录集。这就是它的样子。我需要找出列“ taken”和“ left”的逻辑
Accountno GroupName MaxGroup Amount
101 A 70 0
101 B 70 50
101 C 70 0
101 D 70 20
102 A 95 30
102 B 95 0
102 C 95 5
102 D 95 10
103 A 80 40
103 B 80 15
103 C 80 10
103 D 80 5
答案 0 :(得分:1)
您可以使用OUTER APPLY
如下实现
DECLARE @table AS TABLE(acc_no INT, [group] CHAR(1), [maxgroup] INT, amount INT)
INSERT INTO @table VALUES
(101, 'A', 70, 0),
(101, 'B', 70, 50),
(101, 'C', 70, 0),
(101, 'D', 70, 20),
(102, 'A', 95, 30),
(102, 'B', 95, 0),
(102, 'C', 95, 5),
(102, 'D', 95, 10),
(103, 'A', 80, 40),
(103, 'B', 80,15),
(103, 'C', 80, 10),
(103, 'D', 80, 5)
SELECT t.acc_no,
t.[group],
t.maxgroup,
CASE WHEN t1.assigned = 0 THEN NULL ELSE t.amount END AS taken,
CASE WHEN t1.assigned = 0 THEN NULL ELSE (t.maxgroup - t1.assigned) END [left]
FROM @table t
OUTER APPLY(SELECT SUM([amount]) AS assigned
FROM @table t1 WHERE t1.acc_no = t.acc_no AND t1.[group] <= t.[group]) t1
输出:
acc_no group maxgroup taken left
101 A 70 NULL NULL
101 B 70 50 20
101 C 70 0 20
101 D 70 20 0
102 A 95 30 65
102 B 95 0 65
102 C 95 5 60
102 D 95 10 50
103 A 80 40 40
103 B 80 15 25
103 C 80 10 15
103 D 80 5 10
答案 1 :(得分:1)
$ python dir-test.py -h
usage: dir-test.py [-h] [-d DIR]
optional arguments:
-h, --help show this help message and exit
-d DIR, --dir DIR Directory to use. Default: /tmp
$ python dir-test.py -d /not/real
usage: dir-test.py [-h] [-d DIR]
dir-test.py: error: argument -d/--dir: /not/real is not writable or does not exist.
$ python dir-test.py -d ~
,这将获得每个Accountno的MaxGroup值
max(MaxGroup) over (partition by Accountno)
将累计sum(Amount) over (partition by Accountno order by GroupName)
Amount
不太了解您要求的第二列-- create the sample table
DECLARE @sample AS TABLE
(
Accountno int,
GroupName char,
MaxGroup int,
Amount int
)
-- insert some sample data
INSERT INTO @sample VALUES
(101, 'A', 70, 0),
(101, 'B', 70, 50),
(101, 'C', 70, 0),
(101, 'D', 70, 20),
(102, 'A', 95, 30),
(102, 'B', 95, 0),
(102, 'C', 95, 5),
(102, 'D', 95, 10),
(103, 'A', 80, 40),
(103, 'B', 80, 15),
(103, 'C', 80, 10),
(103, 'D', 80, 5)
-- the query
select *,
[left] = max(MaxGroup) over (partition by Accountno)
- sum(Amount) over (partition by Accountno order by GroupName)
from @sample s
order by Accountno, GroupName
的逻辑是什么。看起来与我的taken
列