【发布时间】:2021-10-12 16:29:04
【问题描述】:
我有一个有几个玩家的桌子,每个玩家都可以选择玩游戏A 或B(只有 2 个游戏可用)并记录他们的日期和时间:
| Player | Date | Time | Game |
|---|---|---|---|
| 1 | 2021-01-01 | 1:00 | A |
| 1 | 2021-01-02 | 1:00 | A |
| 1 | 2021-01-03 | 1:00 | A |
| 1 | 2021-01-04 | 1:00 | A |
| 1 | 2021-01-05 | 1:00 | A |
| 1 | 2021-01-06 | 1:00 | A |
| 1 | 2021-01-07 | 1:00 | A |
| 1 | 2021-01-08 | 1:00 | A |
| 2 | 2021-01-01 | 5:00 | A |
| 2 | 2021-01-02 | 6:00 | B |
| 2 | 2021-01-03 | 1:00 | B |
| 2 | 2021-01-04 | 3:00 | A |
| 2 | 2021-01-05 | 2:00 | A |
| 2 | 2021-01-06 | 4:00 | A |
| 2 | 2021-01-07 | 9:00 | A |
| 2 | 2021-01-08 | 1:00 | B |
| 3 | 2021-01-01 | 5:00 | A |
| 3 | 2021-01-02 | 6:00 | A |
| 3 | 2021-01-03 | 1:00 | B |
| 3 | 2021-01-04 | 3:00 | A |
| 3 | 2021-01-05 | 2:00 | B |
| 3 | 2021-01-06 | 4:00 | A |
| 3 | 2021-01-07 | 5:00 | B |
| 3 | 2021-01-07 | 6:00 | A |
| 3 | 2021-01-07 | 7:00 | B |
| 3 | 2021-01-07 | 9:00 | A |
| 3 | 2021-01-08 | 1:00 | B |
| 4 | 2021-01-02 | 2:00 | A |
| 4 | 2021-01-03 | 2:00 | NULL |
| 4 | 2021-01-04 | 4:00 | NULL |
| 4 | 2021-01-05 | 1:00 | NULL |
| 4 | 2021-01-06 | 9:00 | NULL |
| 4 | 2021-01-07 | 8:00 | B |
对于每个玩家,我都在寻找一个高效且可移植的 SQL 查询,以确定他们使用三(或四)天窗口玩过的独特/独特游戏的数量。请注意,玩游戏的Time(一天内)无关紧要。因此,三天窗口的结果如下所示:
| Player | Start Date | End Date | Unique Games Played |
|---|---|---|---|
| 1 | 2021-01-01 | 2021-01-03 | 1 |
| 1 | 2021-01-02 | 2021-01-04 | 1 |
| 1 | 2021-01-03 | 2021-01-05 | 1 |
| 1 | 2021-01-04 | 2021-01-06 | 1 |
| 1 | 2021-01-05 | 2021-01-07 | 1 |
| 1 | 2021-01-06 | 2021-01-08 | 1 |
| 2 | 2021-01-01 | 2021-01-03 | 2 |
| 2 | 2021-01-02 | 2021-01-04 | 2 |
| 2 | 2021-01-03 | 2021-01-05 | 2 |
| 2 | 2021-01-04 | 2021-01-06 | 1 |
| 2 | 2021-01-05 | 2021-01-07 | 1 |
| 2 | 2021-01-06 | 2021-01-08 | 2 |
| 3 | 2021-01-01 | 2021-01-03 | 2 |
| 3 | 2021-01-02 | 2021-01-04 | 2 |
| 3 | 2021-01-03 | 2021-01-05 | 2 |
| 3 | 2021-01-04 | 2021-01-06 | 2 |
| 3 | 2021-01-05 | 2021-01-07 | 2 |
| 3 | 2021-01-06 | 2021-01-08 | 2 |
| 4 | 2021-01-02 | 2021-01-04 | 1 |
| 4 | 2021-01-03 | 2021-01-05 | 0 |
| 4 | 2021-01-04 | 2021-01-06 | 0 |
| 4 | 2021-01-05 | 2021-01-07 | 1 |
我从类似的东西开始:
SELECT COUNT(DISTINCT GAME)
FROM PLAY_TABLE
GROUP BY PLAYER
ORDER BY DATE
但这还不够,因为它计算的是在整个日期范围内玩的所有不同游戏,而且我不确定如何在每个组内的三天内滚动一个窗口。我了解某些 SQL 数据库风格提供窗口/分析功能,但我更喜欢通用解决方案。
【问题讨论】:
-
用您正在使用的数据库标记您的问题。
标签: sql group-by sql-order-by ansi-sql