【发布时间】:2022-01-23 16:14:00
【问题描述】:
我正在实现一个视图来存储使用昂贵的COUNT(*) 计算的前 10 名用户的排行榜数据。我计划让视图看起来像这样:
id SERIAL PRIMARY KEY
user_id TEXT
type TEXT
rank INTEGER
count INTEGER
-- adding an index to user_id
-- adding a two-column unique index to user_id and type
我无法了解如何创建此视图以正确说明rank 和type。本质上,我有一个像这样的大表(约 3000 万行):
+----+---------+---------+----------------------------+
| id | user_id | type | created_at |
+----+---------+---------+----------------------------+
| 1 | 1 | Diamond | 2021-05-11 17:35:18.399517 |
| 2 | 1 | Diamond | 2021-05-12 17:35:17.399517 |
| 3 | 1 | Diamond | 2021-05-12 17:35:18.399517 |
| 4 | 2 | Diamond | 2021-05-13 17:35:18.399517 |
| 5 | 1 | Clay | 2021-05-14 17:35:18.399517 |
| 6 | 1 | Clay | 2021-05-15 17:35:18.399517 |
+----+---------+---------+----------------------------+
通过上面的表格,我正在尝试实现这样的目标:
+----+---------+---------+------+-------+
| id | user_id | type | rank | count |
+----+---------+---------+------+-------+
| 1 | 1 | Diamond | 1 | 3 |
| 2 | 2 | Diamond | 2 | 1 |
| 3 | 1 | Clay | 1 | 2 |
| 4 | 1 | Weekly | 1 | 5 | -- 3 diamonds + 2 clay obtained between Mon-Sun
| 5 | 2 | Weekly | 2 | 1 |
+----+---------+---------+------+-------+
Weekly我正在数从上周日到下周日的时间。
仅使用 SQL 是否可行,还是需要某种脚本?如果可行,这将如何实现?值得一提的是,有数千种不同的类型,因此最好不要手动指定type。
如果有任何不清楚的地方,请告诉我,我会尽力澄清。谢谢!
【问题讨论】:
-
id和user_id有什么区别? -
id本质上只是可以用作主键的行号/id。 -
可以使用
GROUP BY user_id, type结合RANK()函数生成结果的前三行。现在,要获取最后两行,您需要明确一周的开始和结束时间。 -
一周基本上是从星期日(即 12 月 19 日)到星期日(即 12 月 26 日)。
-
@TheImpaler
RANK()函数在这个查询中究竟是如何工作的?
标签: sql postgresql