SQL: 提取不同玩家的前两天记录
SQL: Extract First Two Days Records for Distinct Players
所以我正在研究如下 table。 table 包含有关游戏玩家的信息。我只想提取每个玩家组在注册日的前 2 天记录
-----------------------------------------------------------------------
| player_id | first_timestamp | last_timestamp | spend |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-08 08:30:21 | 2020-07-08 09:16:11 | 12.26 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 18:10:01 | 2020-07-09 18:21:07 | 24.27 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 20:30:21 | 2020-07-08 21:06:11 | 15.22 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-10 13:21:45 | 2020-07-08 14:00:31 | 13.57 |
-----------------------------------------------------------------------
| 1000000001 | 2020-07-09 15:07:09 | 2020-07-09 15:59:50 | 30.28 |
-----------------------------------------------------------------------
我想要如下回复 table,因此 table 将包含前 2 天的记录,包括他们的注册日。
-----------------------------------------------------------------------
| player_id | first_timestamp | last_timestamp | spend |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-08 08:30:21 | 2020-07-08 09:16:11 | 12.26 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 18:10:01 | 2020-07-09 18:21:07 | 24.27 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 20:30:21 | 2020-07-08 21:06:11 | 15.22 |
-----------------------------------------------------------------------
| 1000000001 | 2020-07-09 15:07:09 | 2020-07-09 15:59:50 | 30.28 |
-----------------------------------------------------------------------
如何在 SQL 查询中实现此目的?提前致谢。
这是一个选项,使用解析函数:
WITH cte AS (
SELECT *, DENSE_RANK() OVER (PARTITION BY player_id ORDER BY DATE(first_timestamp)) dr
FROM yourTable
)
SELECT player_id, first_timestamp, last_timestamp, spend
FROM cte
WHERE dr <= 2;
请注意,我们在这里需要一个排名函数而不是 ROW_NUMBER
,因为给定的日期可能出现不止一次。
所以我正在研究如下 table。 table 包含有关游戏玩家的信息。我只想提取每个玩家组在注册日的前 2 天记录
-----------------------------------------------------------------------
| player_id | first_timestamp | last_timestamp | spend |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-08 08:30:21 | 2020-07-08 09:16:11 | 12.26 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 18:10:01 | 2020-07-09 18:21:07 | 24.27 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 20:30:21 | 2020-07-08 21:06:11 | 15.22 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-10 13:21:45 | 2020-07-08 14:00:31 | 13.57 |
-----------------------------------------------------------------------
| 1000000001 | 2020-07-09 15:07:09 | 2020-07-09 15:59:50 | 30.28 |
-----------------------------------------------------------------------
我想要如下回复 table,因此 table 将包含前 2 天的记录,包括他们的注册日。
-----------------------------------------------------------------------
| player_id | first_timestamp | last_timestamp | spend |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-08 08:30:21 | 2020-07-08 09:16:11 | 12.26 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 18:10:01 | 2020-07-09 18:21:07 | 24.27 |
-----------------------------------------------------------------------
| 1000000000 | 2020-07-09 20:30:21 | 2020-07-08 21:06:11 | 15.22 |
-----------------------------------------------------------------------
| 1000000001 | 2020-07-09 15:07:09 | 2020-07-09 15:59:50 | 30.28 |
-----------------------------------------------------------------------
如何在 SQL 查询中实现此目的?提前致谢。
这是一个选项,使用解析函数:
WITH cte AS (
SELECT *, DENSE_RANK() OVER (PARTITION BY player_id ORDER BY DATE(first_timestamp)) dr
FROM yourTable
)
SELECT player_id, first_timestamp, last_timestamp, spend
FROM cte
WHERE dr <= 2;
请注意,我们在这里需要一个排名函数而不是 ROW_NUMBER
,因为给定的日期可能出现不止一次。