首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用单个查询获取mySQL中的相对计数/频率

如何使用单个查询获取mySQL中的相对计数/频率
EN

Stack Overflow用户
提问于 2018-02-01 22:10:13
回答 3查看 533关注 0票数 0

我想要获得列中值的相对计数/频率(可以是多个)。从这个玩具桌子numbers

代码语言:javascript
运行
复制
 num
  1
  2
  3
  1
  1
  2
  1
  0

这一条:

代码语言:javascript
运行
复制
num | count 
 0  | 0.125
 1  | 0.5
 2  | 0.25   
 3  | 0.125

我可以通过一个变量和两个查询做到这一点:

代码语言:javascript
运行
复制
SET @total = (SELECT COUNT(*) FROM numbers);
SELECT num, ROUND(COUNT(*) / @total, 3) AS count
FROM numbers
GROUP BY num
ORDER BY num ASC

但是如何在一个查询中获得结果(而不列出num的所有可能值)呢?如果我查询多个表的连接,那么即使获得总行数也会变得相当冗长和丑陋。

EN

回答 3

Stack Overflow用户

发布于 2018-02-01 22:28:21

你可以使用窗口函数-

代码语言:javascript
运行
复制
SELECT DISTINCT num,
    ROUND(CAST(COUNT(1) OVER (Partition by num) AS DECIMAL) / CAST(COUNT(1)OVER() AS DECIMAL),3) AS [count]
FROM numbers
ORDER BY num ASC

COUNT(num)会给出相同的结果,这是我个人的偏好,我会计算每行提供的值,而不是计算行中的值,分区句柄将哪些行包括在计数中。

请注意,计数需要转换为小数,否则除法将是整数除法,从而给出错误的数字。

使用DISTINCT而不是GROUP可以让窗口函数应用于整个表,而不仅仅是该表中的每个组,并且仍然只返回每个num的一个结果。

SQLFiddle

票数 0
EN

Stack Overflow用户

发布于 2018-02-01 22:30:11

编辑:这是在msSql中测试的,误读的问题!

您可以尝试这样做:

代码语言:javascript
运行
复制
--DROP TABLE numbers
CREATE TABLE numbers(num decimal(16,3))

INSERT INTO numbers VALUES(1)
INSERT INTO numbers VALUES(2)
INSERT INTO numbers VALUES(3)
INSERT INTO numbers VALUES(1)
INSERT INTO numbers VALUES(1)
INSERT INTO numbers VALUES(2)
INSERT INTO numbers VALUES(1)
INSERT INTO numbers VALUES(0)

SELECT
    num,
    CAST(numCount as DECIMAL(16,2)) / CAST(sum(numCount) over() AS decimal(16,2)) frequency
FROM (
    SELECT 
        num,
        count(num) numCount
    FROM
        numbers
    GROUP BY
        num
) numbers

num frequency
0.000   0.1250000000000000000
1.000   0.5000000000000000000
2.000   0.2500000000000000000
3.000   0.1250000000000000000
票数 0
EN

Stack Overflow用户

发布于 2018-02-11 10:05:10

这是大致相同的击键次数和大致相同的性能,但它只是一条语句:

代码语言:javascript
运行
复制
SELECT  n.num, ROUND(COUNT(*) / t.total, 3) AS count
    FROM ( SELECT  COUNT(*) AS total FROM  numbers ) AS t
    JOIN  numbers AS n
    GROUP BY  n.num
    ORDER BY  n.num ASC 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48564730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档