必须使用表格中玩家的行数更新列值。
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 | |
这可以胜任,但现在我需要更详细的计算。
规则是:
session_type ='等待' 。 。只有当行是最新的玩家行时才会计算行。
PlayerNr =' 0' 。 。 。 。 。 。 。 。 。 。 。虚拟玩家的行将被忽略。
从上面的示例中,结果应为:
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。 谢谢你的帮助。
答案 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