我想要获得列中值的相对计数/频率(可以是多个)。从这个玩具桌子numbers:
num
1
2
3
1
1
2
1
0这一条:
num | count
0 | 0.125
1 | 0.5
2 | 0.25
3 | 0.125我可以通过一个变量和两个查询做到这一点:
SET @total = (SELECT COUNT(*) FROM numbers);
SELECT num, ROUND(COUNT(*) / @total, 3) AS count
FROM numbers
GROUP BY num
ORDER BY num ASC但是如何在一个查询中获得结果(而不列出num的所有可能值)呢?如果我查询多个表的连接,那么即使获得总行数也会变得相当冗长和丑陋。
发布于 2018-02-01 22:28:21
你可以使用窗口函数-
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 ASCCOUNT(num)会给出相同的结果,这是我个人的偏好,我会计算每行提供的值,而不是计算行中的值,分区句柄将哪些行包括在计数中。
请注意,计数需要转换为小数,否则除法将是整数除法,从而给出错误的数字。
使用DISTINCT而不是GROUP可以让窗口函数应用于整个表,而不仅仅是该表中的每个组,并且仍然只返回每个num的一个结果。
SQLFiddle
发布于 2018-02-01 22:30:11
编辑:这是在msSql中测试的,误读的问题!
您可以尝试这样做:
--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发布于 2018-02-11 10:05:10
这是大致相同的击键次数和大致相同的性能,但它只是一条语句:
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 https://stackoverflow.com/questions/48564730
复制相似问题