从唯一列值中获取计数百分比

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