UPDATE具有特定值的行数的列值

时间:2017-09-09 09:42:21

标签: sql-server join count sql-update

必须使用表格中玩家的行数更新列值。

Table_Player:

time=3220706
mem_heap_B=393242041
mem_heap_extra_B=73912175
mem_stacks_B=93616
heap_tree=peak

我已经使用过:

ID  | PlayerNr  | session_type  | Date          | CountSes | 
------------------------------------------------------------
1   | 1001      | cancelled     | 2017-01-01    |
2   | 1001      | ready         | 2017-06-06    | 
3   | 1002      | ready         | 2017-02-02    |
4   | 1002      | ready         | 2017-04-04    |
5   | 1003      | waiting       | 2017-03-03    | 
6   | 1003      | ready         | 2017-05-05    | 
7   | 1004      | waiting       | 2017-10-10    | 
8   | 1004      | ready         | 2017-11-11    | 
9   | 1004      | waiting       | 2017-12-12    | 
10  | 0         | test          |               |

这可以胜任,但现在我需要更详细的计算。

规则是:

  1. session_type ='等待' 。 。只有当行是最新的玩家行时才会计算行。

  2. PlayerNr =' 0' 。 。 。 。 。 。 。 。 。 。 。虚拟玩家的行将被忽略。

  3. 从上面的示例中,结果应为:

    UPDATE a
    SET a.CountSes = b.cnt
    FROM Table_Player a 
    JOIN
     (SELECT PlayerNr, COUNT(*) cnt 
        FROM Table_Player
        WHERE PlayerNr <> '0'
      GROUP BY PlayerNr) 
    b ON a.PlayerNr = b.PlayerNr
    

    这超出了我的知识,任何提示? 数据库是SQL Server 2014 SP2。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

我已使用IIF和分区函数ROW_NUMBER来过滤忽略非新的等待行,并使用SUM代替COUNT

UPDATE t
SET CountSes = ISNULL(CNT, 0)
FROM Table_Player as t
LEFT JOIN (
    SELECT SUM(IIF(session_type = 'waiting'
                AND RN > 1, 0, 1)) AS CNT
        , PlayerNr
    FROM (
        SELECT *
            , ROW_NUMBER() OVER (
                PARTITION BY PlayerNr ORDER BY DATE DESC
                ) RN
        FROM Table_Player
        WHERE (PlayerNr <> 0)
        ) t
    GROUP BY PlayerNr
    ) as p ON p.PlayerNr = t.PlayerNr

rextester演示:http://rextester.com/NBHXYL39648