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

时间:2013-06-05 13:58:08

标签: sql sql-server

我必须找到一种方法来解决这个问题...在这样的表中,我会看到我的列“C”在每行上增加其值,从一个常数开始,在“B”列中添加值,在同一列“C”中按先前值添加值。

此外......按用户分组。

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

USER - POINT - INITIALPOINT
Phil - 1000 -  1350
Phil - 150   - 1500
Phil - 200   - 1700
Mark - 300   - 400
Mark - 250   - 650

我该怎么做?

3 个答案:

答案 0 :(得分:2)

使用窗口。表声明是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)和一个更好的方法来做一个起始值(我使用一个单独的表)

答案 1 :(得分:1)

您没有指定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。它可以是增加的主键或其他东西,只要它定义行的正确排序。

答案 2 :(得分:1)

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;