dri*_*lii 4 postgresql database-design aggregate date
我有一张桌子,我想将其作为如下所述的邀请排行榜。我想创建一个查询来计算给定月份中重复行的数量并以降序排列。
通读一些问题,这个查询似乎有效:
SELECT COUNT(invite_code) AS counted
FROM invite_table
GROUP BY invite_code
ORDER BY counted DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
但它不考虑月份。我正在寻找的是获得最常出现的user_code
在指定月份的地方。此外,对表设计的任何批评都是受欢迎的,因为我故意设计它以便有具有重复值的重复行。我正在尝试跟踪在给定月份中使用最多邀请码的用户,我还有一些代码指示用户来自哪个频道(例如,可能在 FB 中看到广告),这是一个有效的表格设计吗?
表“public.invite_table” 专栏 | 类型 | 整理 | 可空 | 默认 -------------+--------------+-----------+- ---------+--------- 用户代码 | 性格变化| | 不为空| 邀请码 | 性格变化| | | 月 | 字符变化(3) | | 不为空| 点 | 整数 | | 不为空| 索引: "invite_table_pkey" PRIMARY KEY, btree (user_code) 外键约束: “invite_table_user_code_fkey”外键(用户代码)参考用户表(用户代码)
获得最常出现
user_code
在指定月份的地方
由于user_code
是主键,这个问题将是无稽之谈。永远不会超过一个。我猜你的意思是invite_code
?
只需添加一个WHERE
条款。并且由于该列可以为 NULL,还可以考虑排除 NULL 值:
SELECT invite_code, COUNT(*) AS counted
FROM invite_table
WHERE month = 'May' -- or whatever is stored in your varchar(3) column
AND invite_code IS NOT NULL -- exclude NULL
GROUP BY invite_code
ORDER BY counted DESC, invite_code -- to break ties in deterministic fashion
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
varchar(3)
如果可以有超过一年的数据,则月份列似乎不是很有用。我会date
为它使用数据类型。您可以使用to_char()
任何您喜欢的演示方式对其进行格式化。喜欢:
SELECT to_char(date '2017-12-01', 'Mon'); -- 'Dec'
Run Code Online (Sandbox Code Playgroud)
该列可能如下所示(也处理您的评论):
...
, inserted_at date DEFAULT CURRENT_DATE
...
Run Code Online (Sandbox Code Playgroud)
在INSERT
语句中省略该列时输入默认值。
或者,如果真的只有月份相关:
... DEFAULT date_trunc('month', now())::date
Run Code Online (Sandbox Code Playgroud)
或者存储完整的timestamptz
(8 个字节,这就是我可能会做的):
...
, inserted_at timestamptz DEFAULT now()
...
Run Code Online (Sandbox Code Playgroud)
请注意,日期和时间戳取决于您当前的时区设置。细节:
归档时间: |
|
查看次数: |
7047 次 |
最近记录: |