SQL Server:显示基于其他行进行计算的新列

SQL Server:显示基于其他行进行计算的新列,sql,sql-server,Sql,Sql Server,我使用的是SQL Server,我有一个表,简化如下: item ----- order-----Active ------------------------------- a-------------1---------true b-------------2---------false c-------------3---------true d-------------4---------true e-------------5---------false f----------

我使用的是SQL Server,我有一个表,简化如下:

item ----- order-----Active
-------------------------------    
a-------------1---------true
b-------------2---------false
c-------------3---------true
d-------------4---------true
e-------------5---------false
f-------------6---------true
我想查询返回三列和一个额外的列调用neworder,它为每一个项目减去一个非活动项,即订单号低于自身的假项目。因此,上表将成为

item ----- ordering-----Active----------NewOrder
-------------------------------------------------    
a-------------1---------true----------1
b-------------2---------false----------2
c-------------3---------true----------2
d-------------4---------true----------3
e-------------5---------false----------4
f-------------6---------true----------4
我的尝试:

Select 
    g.item, g.ordering, g.active,  
    g.ordering - (Select Count(x.ordering)
                  from grocery As x
                  where x.ordering < g.ordering 
                    and x.active = false
                  group by x.ordering) As NewOrder
 From 
     grocery as g
这不起作用,因为子查询包含多行。但我真的不知道该怎么做。这甚至可以只使用子查询吗

感谢您的建议或帮助

编辑:

数据库中有6行以上,但顺序不正确。 基本上,一个项目的新订单是它自己的订单减去其订单低于该项目订单的非活动项目的数量。
同样,非活动项是active=false的项。

我认为下面的查询将给出您想要的结果,您可以忽略空值。 当active为true时,您基本上希望NEWORDER为true,这样就可以忽略false的NULL值

输出


我认为下面的查询将给出您想要的结果,您可以忽略空值。 当active为true时,您基本上希望NEWORDER为true,这样就可以忽略false的NULL值

输出

这里有一条路

SELECT item,
       [order],
       active,
       NewOrder = Sum(t)OVER(ORDER BY [order]) 
FROM   (SELECT *,
               CASE WHEN Lag(Active)OVER(ORDER BY [order]) = 'false' THEN 0 ELSE 1 END AS t
        FROM   (VALUES ('a',1,'true' ),
                       ('b',2,'false' ),
                       ('c',3,'true' ),
                       ('d',4,'true' ),
                       ('e',5,'false' ),
                       ('f',6,'true' )) tc (item, [order], Active)) a 
结果:

这里有一条路

SELECT item,
       [order],
       active,
       NewOrder = Sum(t)OVER(ORDER BY [order]) 
FROM   (SELECT *,
               CASE WHEN Lag(Active)OVER(ORDER BY [order]) = 'false' THEN 0 ELSE 1 END AS t
        FROM   (VALUES ('a',1,'true' ),
                       ('b',2,'false' ),
                       ('c',3,'true' ),
                       ('d',4,'true' ),
                       ('e',5,'false' ),
                       ('f',6,'true' )) tc (item, [order], Active)) a 
结果:


你的预期输出似乎不符合你的逻辑。考虑使用连接,如果你真的想要订单- 1,你可以做到这一点。然而,听起来你可能想要基于数字排序的上一个订单,我猜,你不能保证订单是连续的。这是逻辑上的一次飞跃,但这是很常见的事情,也许是真的?我在最后补充了另一个解释。希望它能澄清我的答案,如果它的预期输出不符合你的逻辑。考虑使用连接,如果你真的想要订单- 1,你可以这样做。然而,听起来你可能想要基于数字排序的上一个订单,我猜,你不能保证订单是连续的。这是逻辑上的一次飞跃,但这是很常见的事情,也许是真的?我在最后补充了另一个解释。希望它能消除困惑看看我的答案如果有帮助的话
SELECT item,
       [order],
       active,
       NewOrder = Sum(t)OVER(ORDER BY [order]) 
FROM   (SELECT *,
               CASE WHEN Lag(Active)OVER(ORDER BY [order]) = 'false' THEN 0 ELSE 1 END AS t
        FROM   (VALUES ('a',1,'true' ),
                       ('b',2,'false' ),
                       ('c',3,'true' ),
                       ('d',4,'true' ),
                       ('e',5,'false' ),
                       ('f',6,'true' )) tc (item, [order], Active)) a 
+------+-------+--------+----------+
| item | order | active | NewOrder |
+------+-------+--------+----------+
| a    |     1 | true   |        1 |
| b    |     2 | false  |        2 |
| c    |     3 | true   |        2 |
| d    |     4 | true   |        3 |
| e    |     5 | false  |        4 |
| f    |     6 | true   |        4 |
+------+-------+--------+----------+