在select sql语句中按前一行增加值列



我必须找到解决这个问题的方法…在这样的表中,我会看到我的列"C"在每一行上增加他的值,从一个常数开始,在列"B"中增加值,并在同一列"C"中增加前一个值。

此外……按用户分组。

例如:(起始点Phil: 350,起始点Mark: 100)

<>之前用户-点-初始点菲尔- 1000 - 1350菲尔- 150 - 1500菲尔- 200 - 1700马克- 300 - 400马克- 250 - 650之前

我该怎么做呢?

使用窗口。表声明是SQL Server,但如果你的RDBMS支持它,其余的是标准SQL (SQL Server 2012, PostgreSQL 9.1等)

DECLARE @t TABLE (ID int IDENTITY(1,1), UserName varchar(100), Point int);
INSERT @t (UserName, Point)
VALUES
('Phil', 1000),
('Phil', 150),
('Phil', 200),
('Mark', 300),
('Mark', 250);
DECLARE @n TABLE (UserName varchar(100), StartPoint int);
INSERT @n (UserName, StartPoint)
VALUES
('Phil', 350),
('Mark', 100);
SELECT
    T.ID, T.UserName, T.Point,
    N.StartPoint + SUM(Point) OVER(PARTITION BY T.UserName ORDER BY T.ID ROWS UNBOUNDED PRECEDING)
FROM
    @n N
    JOIN
    @t T ON N.UserName = T.UserName
ORDER BY
    T.ID;

要做到这一点,您需要一个表的顺序(我使用ID)和一个更好的方法来做一个起始值(我使用一个单独的表)

SQL Server 2008不支持直接使用窗口函数累计求和。您可以使用相关子查询来达到相同的效果。

因此,使用与GBN相同的结构:
DECLARE @t TABLE (ID int IDENTITY(1,1), UserName varchar(100), Point int);
INSERT @t (UserName, Point)
VALUES
('Phil', 1000),
('Phil', 150),
('Phil', 200),
('Mark', 300),
('Mark', 250);
DECLARE @n TABLE (UserName varchar(100), StartPoint int);
INSERT @n (UserName, StartPoint)
VALUES
('Phil', 350),
('Mark', 100);
SELECT
    T.ID, T.UserName, T.Point,
    (N.StartPoint +
     (select SUM(Point) from @t t2 where t2.UserName = t.userName and t2.ID <= t.id)
    )
FROM
    @n N
    JOIN
    @t T ON N.UserName = T.UserName
ORDER BY
    T.ID;

您没有指定您的DBMS,所以这是ANSI SQL:

select "user",
       point,
       case 
         when "user" = 'Phil' then 350
         else 100
       end + sum(point) over (partition by "user" order by some_date_column) as sum
from the_table
where "user" in ('Mark', 'Phil')
order by "user", some_date_column;

您需要一些列来对行进行排序,否则"运行和"将毫无意义,因为表中的行没有排序(在关系表中没有"第一行"这样的东西)。这是我的例子中的some_date_column。它可以是递增的主键,也可以是其他的,只要它定义了正确的行顺序。

最新更新