比较单个列中的行值并在 SQL-Server table 中相应地更新标志
Compare the rows value in a single column and update the flag accordingly in SQL-Server table
我有一个table如下
A B C D E
2471 D471 0 24.00 1
2471 D471 0 353.50 1
2471 D471 1 211.00 1
2471 E471 1 343.00 1
2471 E471 0 56.00 1
2471 E471 0 177.06 1
2471 E471 0 9.31 1
2471 F471 0 10.31 1
2471 F471 1 10.31 1
我需要对 A、B 和 C 进行分组,并且需要对 E 的值求和,示例 table 下面是求和后的样子
A B C E SumValue
2471 D471 0 1 377.500000
2471 D471 1 1 211.000000
2471 E471 1 1 343.000000
2471 E471 0 1 242.370000
2471 F471 0 1 10.31
2471 F471 1 1 10.31
我需要通过将 C 为 0 的第一行的 A、B、C 与 C 为 1 的第二行以及具有最低值的第二行进行分组来比较 SumValue 这些记录在 E 列其余部分中应为 1记录的 E 列中应为 0。如果 SumValue 相同,而在最后两行中,则 E 列应为 1,其中 C 为 1,E 列应为 0,其中 C 为 0。
我需要的输出是这样的...在这种情况下我需要做的就是更新E列..
A B C D E
2471 D471 0 24.00 0
2471 D471 0 353.50 0
2471 D471 1 211.00 1
2471 E471 1 343.00 0
2471 E471 0 56.00 1
2471 E471 0 177.06 1
2471 E471 0 9.31 1
2471 F471 0 10.31 0
2471 F471 1 10.31 1
用于创建 table 和插入数据的脚本
CREATE TABLE tablename
([A] int, [B] varchar(10), [C] int, [D] decimal(10, 2), [E] int)
;
INSERT INTO tablename
([A], [B], [C], [D], [E])
VALUES
(2471, 'D471', 0, 24.00, 1),
(2471, 'D471', 0, 353.50, 1),
(2471, 'D471', 1, 211.00, 1),
(2471, 'E471', 1, 343.00, 1),
(2471, 'E471', 0, 56.00, 1),
(2471, 'E471', 0, 177.06, 1),
(2471, 'E471', 0, 9.31, 1),
(2471, 'F471', 0, 10.31, 1),
(2471, 'F471', 1, 10.31, 1)
;
如果您对此查询有任何疑问,请告诉我
如果我理解正确的话:
with toupdate as (
select t.*,
dense_rank() over (partition by a, b order by sum_d, c desc) as seqnum
from (select t.*, sum(d) over (partition by a, b, c) as sum_d
from tablename t
) t
)
update toupdate
set e = (case when seqnum = 1 then 1 else 0 end);
我有一个table如下
A B C D E
2471 D471 0 24.00 1
2471 D471 0 353.50 1
2471 D471 1 211.00 1
2471 E471 1 343.00 1
2471 E471 0 56.00 1
2471 E471 0 177.06 1
2471 E471 0 9.31 1
2471 F471 0 10.31 1
2471 F471 1 10.31 1
我需要对 A、B 和 C 进行分组,并且需要对 E 的值求和,示例 table 下面是求和后的样子
A B C E SumValue
2471 D471 0 1 377.500000
2471 D471 1 1 211.000000
2471 E471 1 1 343.000000
2471 E471 0 1 242.370000
2471 F471 0 1 10.31
2471 F471 1 1 10.31
我需要通过将 C 为 0 的第一行的 A、B、C 与 C 为 1 的第二行以及具有最低值的第二行进行分组来比较 SumValue 这些记录在 E 列其余部分中应为 1记录的 E 列中应为 0。如果 SumValue 相同,而在最后两行中,则 E 列应为 1,其中 C 为 1,E 列应为 0,其中 C 为 0。
我需要的输出是这样的...在这种情况下我需要做的就是更新E列..
A B C D E
2471 D471 0 24.00 0
2471 D471 0 353.50 0
2471 D471 1 211.00 1
2471 E471 1 343.00 0
2471 E471 0 56.00 1
2471 E471 0 177.06 1
2471 E471 0 9.31 1
2471 F471 0 10.31 0
2471 F471 1 10.31 1
用于创建 table 和插入数据的脚本
CREATE TABLE tablename
([A] int, [B] varchar(10), [C] int, [D] decimal(10, 2), [E] int)
;
INSERT INTO tablename
([A], [B], [C], [D], [E])
VALUES
(2471, 'D471', 0, 24.00, 1),
(2471, 'D471', 0, 353.50, 1),
(2471, 'D471', 1, 211.00, 1),
(2471, 'E471', 1, 343.00, 1),
(2471, 'E471', 0, 56.00, 1),
(2471, 'E471', 0, 177.06, 1),
(2471, 'E471', 0, 9.31, 1),
(2471, 'F471', 0, 10.31, 1),
(2471, 'F471', 1, 10.31, 1)
;
如果您对此查询有任何疑问,请告诉我
如果我理解正确的话:
with toupdate as (
select t.*,
dense_rank() over (partition by a, b order by sum_d, c desc) as seqnum
from (select t.*, sum(d) over (partition by a, b, c) as sum_d
from tablename t
) t
)
update toupdate
set e = (case when seqnum = 1 then 1 else 0 end);