选择按帐户分组的最后一行并分配号码

时间:2015-08-17 18:19:01

标签: sql-server-2008

我有一张桌子“Log” 当有人登录服务器时,我的游戏服务器会在此表中插入记录,然后在他们注销时插入第二条记录。 我想要做的是创建一个查询来计算登录的人数。

插入表“Log”的主要数据

登录后

[Type] = 0
[Player1] = Their account ID
[Value2] = a random number which matches the logout row when they logout
[Value3] = 0

退出时:

[Type] = 1
[Player1] = Their account ID
[Value2] = a random number which matches the login row when they logout
[Value3] = some random number

有没有办法可以计算每个帐户的最后一个“Player1”并检查“Type”是否为0,这意味着帐户已登录,然后回显结果。

我正在寻找的结果会将每个帐户的最后一条记录计算在内。

注意:每次帐户登录和退出时都会插入2条记录,因此,如果1个帐户登录20次,则“日志”中将有40条记录

3 个答案:

答案 0 :(得分:1)

这样做的一种方法是计算所有类型为0的行,这些行不存在具有相同播放器和更晚日期的任何类型1行:

select count(*) as number_of_logged_in
from log l
where Type = 0 -- 0 meaning log on event
-- and [Value3] = 0 -- maybe this should be included
and not exists (
    select 1 from log 
    where Player1 = l.Player1 
      and type = 1  -- 1 meaning log out event
      and date > l.date
      -- and [Value2] = l.[Value2] -- maybe this should be included
);

我发现你的问题陈述有点令人困惑,因为你说你想要计算登录的人数,但是你说我想计算每个[Player!]的最后一个[Type]是1 ,这似乎是相反的。它也不清楚为什么随机数很重要 - 如果用户的最后一个记录类型是0那么它们应被视为已登录,或者?

带有一些演示数据的

Sample SQL Fiddle

答案 1 :(得分:0)

我假设你想要所有已登录玩家名单的列表,所以你可以尝试使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <a href="http://www.example.com/" width="900px" data-featherlight="iframe">Release the iFrame</a>来获得你想要的东西,

ROW_NUMBER()

答案 2 :(得分:0)

如果您知道,所有登录和注销都存储在Log中没有间隙,您可以简单地计算它们,如果存在差异,您知道该播放器当前已登录。

SELECT logins.player1, logouts.cnt - logins.cnt
FROM
    (select player1, count(*) as cnt from Log where type = 0 group by player1) as logins
LEFT OUTER JOIN
    (select player1, count(*) as cnt from Log where type = 1 group by player1) as logouts
ON  (logins.player1 = logouts.player1)
WHERE logins.cnt > logouts.cnt or logouts.player1 is null

如果玩家一次登录并且从未退出,则需要left outer join。对不起,如果您遇到语法问题。我只是在没有测试的情况下编写了这个,并且通常在那里使用Teradata系统和SQL Dialect。但是由于这里给出的SQL是简单的Ansi,它应该适用于任何数据库。