如何计算;“运行总数”;在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()已经就位。您使用的是什么RDBMS
MySQL
Postgres
sql server 2008
等更新了问题。这是SQL Server 2008。太棒了!谢谢:)马克斯的回答应该能在2008年起作用。窗口函数是实现这类功能的方法。2008年的窗口函数的实现非常有限,但我相信Row_Number()适用于该版本。谢谢你,Gordon。我明天会试试你的解决方案+祝你好运。对列名也有很好的评论。这不是我将使用的真实列名,但出于示例目的,序列确实更好。谢谢你,Gordon。我明天会试试你的解决方案+祝你好运。对列名也有很好的评论。这不是我将使用的真实列名,但出于示例目的,序列确实更好。