从唯一列值中获取计数百分比
get percentage from count from a unique column values
嗨,我有一个 table 如下
k_id |l_id |count | avg
----------------------------------
| 1 | 10 | 4 |
| 1 | 10 | 3 |
| 1 | 10 | 2 |
| 1 | 10 | 1 |
| 1 | 10 | 1 |
| 1 | 9 | 1 |
| 3 | 8 | 1 |
| 2 | 7 | 1 |
在 select 语句中,我试图从计数中获取百分比,但我不想包括所有行。我想单独计算 k_id 和 l_id 是唯一的。
现在我有一个 select sub_query 如下所示:
SELECT k_id, l_id, count, 100.0 * count / sum(count) over () AS avg
FROM (
select k_id, l_id, count(m_id) as count
from schema.table
group by k_id, l_id order by count desc
) a
group by k_id, l_id, count
实际结果:
k_id |l_id |count | avg
-------------------------
| 1 | 10 | 4 | 28.57
| 1 | 10 | 3 | 21.42
| 1 | 10 | 2 | 14.28
| 1 | 10 | 1 | 7.14
| 1 | 10 | 1 | 7.14
| 1 | 9 | 1 | 7.14
| 3 | 8 | 1 | 7.14
| 2 | 7 | 1 | 7.14
我怎样才能得到下面的结果
预期结果:
k_id |l_id |count | avg
-------------------------
| 1 | 10 | 4 | 36.36
| 1 | 10 | 3 | 27.27
| 1 | 10 | 2 | 18.18
| 1 | 10 | 1 | 9.09
| 1 | 10 | 1 | 9.09
| 1 | 9 | 1 | 100.00
| 3 | 8 | 1 | 100.00
| 2 | 7 | 1 | 100.00
谢谢。
您只需要 PARTITION
您的 SUM
超过 k_id, l_id
。这样你就可以使用 k_id, l_id = 1, 10
而不是整个 sum(count)
.
来获得平均值
SELECT
k_id, l_id, count,
100.0 * count / sum(count) OVER (PARTITION BY k_id, l_id) AS avg
FROM ( ... )
ORDER BY l_id DESC;
k_id | l_id | count | avg
------+------+-------+----------------------
1 | 10 | 4 | 36.3636363636363636
1 | 10 | 3 | 27.2727272727272727
1 | 10 | 2 | 18.1818181818181818
1 | 10 | 1 | 9.0909090909090909
1 | 10 | 1 | 9.0909090909090909
1 | 9 | 1 | 100.0000000000000000
3 | 8 | 1 | 100.0000000000000000
2 | 7 | 1 | 100.0000000000000000
嗨,我有一个 table 如下
k_id |l_id |count | avg
----------------------------------
| 1 | 10 | 4 |
| 1 | 10 | 3 |
| 1 | 10 | 2 |
| 1 | 10 | 1 |
| 1 | 10 | 1 |
| 1 | 9 | 1 |
| 3 | 8 | 1 |
| 2 | 7 | 1 |
在 select 语句中,我试图从计数中获取百分比,但我不想包括所有行。我想单独计算 k_id 和 l_id 是唯一的。
现在我有一个 select sub_query 如下所示:
SELECT k_id, l_id, count, 100.0 * count / sum(count) over () AS avg
FROM (
select k_id, l_id, count(m_id) as count
from schema.table
group by k_id, l_id order by count desc
) a
group by k_id, l_id, count
实际结果:
k_id |l_id |count | avg
-------------------------
| 1 | 10 | 4 | 28.57
| 1 | 10 | 3 | 21.42
| 1 | 10 | 2 | 14.28
| 1 | 10 | 1 | 7.14
| 1 | 10 | 1 | 7.14
| 1 | 9 | 1 | 7.14
| 3 | 8 | 1 | 7.14
| 2 | 7 | 1 | 7.14
我怎样才能得到下面的结果
预期结果:
k_id |l_id |count | avg
-------------------------
| 1 | 10 | 4 | 36.36
| 1 | 10 | 3 | 27.27
| 1 | 10 | 2 | 18.18
| 1 | 10 | 1 | 9.09
| 1 | 10 | 1 | 9.09
| 1 | 9 | 1 | 100.00
| 3 | 8 | 1 | 100.00
| 2 | 7 | 1 | 100.00
谢谢。
您只需要 PARTITION
您的 SUM
超过 k_id, l_id
。这样你就可以使用 k_id, l_id = 1, 10
而不是整个 sum(count)
.
SELECT
k_id, l_id, count,
100.0 * count / sum(count) OVER (PARTITION BY k_id, l_id) AS avg
FROM ( ... )
ORDER BY l_id DESC;
k_id | l_id | count | avg
------+------+-------+----------------------
1 | 10 | 4 | 36.3636363636363636
1 | 10 | 3 | 27.2727272727272727
1 | 10 | 2 | 18.1818181818181818
1 | 10 | 1 | 9.0909090909090909
1 | 10 | 1 | 9.0909090909090909
1 | 9 | 1 | 100.0000000000000000
3 | 8 | 1 | 100.0000000000000000
2 | 7 | 1 | 100.0000000000000000