在 SQL 中创建十分位数

问题描述 投票:0回答:1

我试图将我的数据分成十分位数,但不是传统意义上的十分位数,因为维度是十分位数的基础。

我有 463 个独特的 it_scores,范围从 316-900(我的维度),总计 1,296,070 trade_counts(我的度量)。使用以下代码将我的数据分为 10 个桶,其中包含 47 个唯一的 it_scores:

ntile(10) over (order by it_score)) as tileno

虽然这绝对是在做它应该做的事情,但我需要在总 trade_counts 的基础上构建我的存储桶,每个存储桶包含大约 129.6k 个观察值。 it_score 仍然是维度,但范围不一定相等,即十分位数 10 的范围可能为 316-688,有 129.6k 个观测值,而十分位数 9 的范围可能为 689-712,也有 129.6k 个观测值。

我该如何实现这一目标?

sql hive percentile
1个回答
0
投票

您可以使用窗口函数根据累积值分配十分位

trade_counts

SELECT
  decile,
  SUM(trade_count) AS decile_trade_count
FROM
  (
    SELECT
      it_score,
      trade_count,
      FLOOR(
        (SUM(trade_count) OVER (ORDER BY it_score) - 1) / (SUM(trade_count) OVER ()) * 10
      ) + 1 AS decile
    FROM table
  ) sub
GROUP BY decile
ORDER BY decile;
© www.soinside.com 2019 - 2024. All rights reserved.