Mio*_*Mio 5 postgresql group-by
我有这个数据:
CREATE TABLE tickets(user_id int NOT NULL);
INSERT INTO tickets VALUES (1);
INSERT INTO tickets VALUES (2);
INSERT INTO tickets VALUES (3); -- 3 times
INSERT INTO tickets VALUES (4); -- 10 times
Run Code Online (Sandbox Code Playgroud)
现在我想显示每个用户的票数百分比。
我试过这个:
WITH number_of_tickets AS (
SELECT user_id, COUNT(user_id) AS number_of_tickets_per_user
FROM tickets
GROUP BY user_id
)
SELECT
number_of_tickets_per_user,
ROUND((COUNT(user_id) * 100.0) / (SELECT COUNT(DISTINCT(user_id)) FROM tickets), 3) -- No no no no
FROM number_of_tickets
GROUP BY number_of_tickets_per_user
ORDER BY number_of_tickets_per_user;
Run Code Online (Sandbox Code Playgroud)
但我可能不能很好地处理百分比计算。结果总是显示每个用户每个票数的 25%。
谢谢
小智 9
我建议使用窗口函数:
SELECT DISTINCT user_id,
(count(*) over (partition by user_id) / count(*) over ()::numeric)
FROM tickets
ORDER BY user_id;
user_id | ?column?
---------+------------------------
1 | 0.06666666666666666667
2 | 0.06666666666666666667
3 | 0.20000000000000000000
4 | 0.66666666666666666667
(4 rows)
Run Code Online (Sandbox Code Playgroud)
WITH number_of_tickets AS (
SELECT user_id, COUNT(user_id) AS number_of_tickets_per_user
FROM tickets
GROUP BY user_id
),
total_tickets AS (
SELECT SUM(number_of_tickets_per_user) total_tickets
FROM number_of_tickets
)
SELECT
user_id,
number_of_tickets_per_user,
ROUND(number_of_tickets_per_user / total_tickets,3) percent
FROM number_of_tickets, total_tickets;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6721 次 |
| 最近记录: |