如何计算;“运行总数”;在SQL中
给一张桌子如何计算;“运行总数”;在SQL中,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,给一张桌子 ID FRUIT -- ----- 1 APPLE 2 BANANA 3 PEAR 4 APPLE 5 APPLE 6 PEAR 我想要这个 ID FRUIT RUNNING_TOTAL -- ----- ------------- 1 APPLE 1 2 BANANA 1 3 PEAR 1 4 APPLE 2 5 APPLE 3 6 PEAR 2 (按照ID顺序,第一次遇到给定的水果时,我们将该行的RUN
ID FRUIT
-- -----
1 APPLE
2 BANANA
3 PEAR
4 APPLE
5 APPLE
6 PEAR
我想要这个
ID FRUIT RUNNING_TOTAL
-- ----- -------------
1 APPLE 1
2 BANANA 1
3 PEAR 1
4 APPLE 2
5 APPLE 3
6 PEAR 2
(按照ID顺序,第一次遇到给定的水果时,我们将该行的RUNNIN_总数的值设置为1;第二次遇到给定的水果时,RUNNIN_总数为2,依此类推)
我想我需要先添加一个这样的专栏:
alter table Fruits add RUNNING_TOTAL int null
然后用如下方法设置新列的值
update Fruits set RUNNING_TOTAL = ...
但我不知道如何完成最后的陈述。有人能帮忙吗?我正在使用SQLServer2008,但一个可移植的解决方案将是理想的
谢谢
select id, fruit, row_number() over (partition by fruit order by id) as running_total
from fruits
order by id
然后呢,
alter table Fruits add RUNNING_TOTAL int null
update fruits set running_total = subquery.running_total
from fruits
inner join (
select id, row_number() over (partition by fruit order by id) as running_total
from fruits
)subquery on fruits.id = subquery.id
select * from fruits
然后呢,
alter table Fruits add RUNNING_TOTAL int null
update fruits set running_total = subquery.running_total
from fruits
inner join (
select id, row_number() over (partition by fruit order by id) as running_total
from fruits
)subquery on fruits.id = subquery.id
select * from fruits
在SQL Server 2008中,可以使用可更新的CTE:
with toupdate as (
select f.*, row_number() over (partition by fruit order by id) as seqnum
from fruits f
)
update toupdate
set running_total = seqnum;
我真的不会把这样一个专栏叫做“running_total”。在我看来,它更像是一个“序列号”。“Running_total”表示累计总和。在SQL Server 2008中,您可以使用可更新的CTE:
with toupdate as (
select f.*, row_number() over (partition by fruit order by id) as seqnum
from fruits f
)
update toupdate
set running_total = seqnum;
我真的不会把这样一个专栏叫做“running_total”。在我看来,它更像是一个“序列号”。“Running_total”表示累计金额。您使用的RDBMS是什么
MySQL
,Postgres
,sql server 2008
等更新了问题。这是SQL Server 2008。太棒了!谢谢:)马克斯的回答应该能在2008年起作用。窗口函数是实现这类功能的方法。2008年的窗口函数实现非常有限,但我相信该版本的Row_Number()已经就位。您使用的是什么RDBMSMySQL
,Postgres
,sql server 2008
等更新了问题。这是SQL Server 2008。太棒了!谢谢:)马克斯的回答应该能在2008年起作用。窗口函数是实现这类功能的方法。2008年的窗口函数的实现非常有限,但我相信Row_Number()适用于该版本。谢谢你,Gordon。我明天会试试你的解决方案+祝你好运。对列名也有很好的评论。这不是我将使用的真实列名,但出于示例目的,序列确实更好。谢谢你,Gordon。我明天会试试你的解决方案+祝你好运。对列名也有很好的评论。这不是我将使用的真实列名,但出于示例目的,序列确实更好。