2

今天,我需要你的帮助。

我有一个统计网站,我从 Game Webservices 获取数据。我想实现一个新功能,但我不知道怎么做。

我想猜测玩家的连接时间。

我有一个脚本,它每小时收集一次数据并将这些数据存储在一个表中。想象一下,我有一张表,其中包含:player_id、分数和小时(整数,只是 H),以及月份的天数。

然后,例如,如果 17 小时和 18 小时之间的分数不同,则玩家已连接到他的帐户。

为简化起见,假设我有一张桌子,每天从 1 到 31,小时从 0 到 23。

在月底,我需要执行一个查询来计算每小时播放器在这一小时内连接的天数。

Example :

0 => 31     The player has been connected between 23 and 0  : every days
1 => 3      The player has been connected between 0 and 1  : 3 days a month
2 => 5      The player has been connected between 1 and 2  : 5 days a month
3 => 10     The player has been connected between 3 and 4  : 10 days a month
...
23 => 4

我想我可以从第 1 小时 0 到第 31 小时 23 点按天数和小时数以及 player_id 排序,并使用以下 CASE 进行第一次 SELECT:

SELECT 
    table.*,  
   (CASE WHEN ACTUAL_ROW.score!=PREVIOUS_ROW.score THEN 1 ELSE 0) AS active
FROM table

知道播放器是否已连接到每一行。然后每小时做一个 GROUP BY 和一个 SUM 很简单。但我不知道如何将前一行与实际进行比较

你有任何想法或提示如何做到这一点?PL/SQL 这样做更好吗?

注意:我正在使用 PostGreSQL

谢谢

4

2 回答 2

3

LAG您可以使用窗口功能访问表格的前一行。

尝试使用类似的东西

SELECT player_id, count(CASE WHEN score > prev_score THEN 1 END)
FROM(
SELECT player_id, score, mm, hh, LAG(score) OVER (ORDER BY mm,hh) as prev_score
FROM your_table)
GROUP BY player_id

附加建议 - 存储完整的时间戳,而不是日期和小时字段。您始终可以使用函数从时间戳中获取日期和时间。

窗口功能手册:one,two

于 2013-05-17T16:32:28.697 回答
0

这里的问题是,我们不是检查玩家何时“连接”,而是检查玩家何时“获得积分”,这可能是相似的——也可能不是;并且每隔一小时(一小时内三次登录计为一次)。同样,一名玩家保持登录三个小时并在此期间累积积分将导致“登录”一个、两个或三个数据点,具体取决于。

有了这些警告,我们可以自己加入分数表:

SELECT a.player_id, a.day, a.hour, a.score - b.score AS chg
   FROM cdata AS a
   JOIN cdata AS b
   ON (
        (a.player_id = b.player_id AND a.score != b.score)
   AND (
        (a.hour > 0 AND a.day = b.day   AND b.hour = a.hour-1)
        OR
        (a.hour = 0 AND a.day = b.day+1 AND b.hour = 23)
       )
   )

这将为用户生成一系列统计数据,包括他的分数变化的日期和时间。

您可以在收集子SELECT 中使用它

SELECT player_id, hour, COUNT(player_id) FROM ( ... ) AS changes
    GROUP BY player_id, hour
    ORDER BY player_id, hour;

这将在“更改”中返回一个介于 1 到 31 之间的数字。没有登录的小时数将不计算在内。

我试图用这个SQLFiddle提供一个测试用例。以上不是 PostgreSQL 特定的,您可以使用 PostgreSQL窗口函数优化内部查询。

于 2013-05-17T16:50:51.463 回答