查找给定列的最频繁值

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”外键(用户代码)参考用户表(用户代码)

Erw*_*ter 5

获得最常出现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)

此处此处阅读手册。

请注意,日期时间戳取决于您当前的时区设置。细节: