Sql 在postgres查询中,我可以将一列拆分为四分位数以进行分区结果吗?

Sql 在postgres查询中,我可以将一列拆分为四分位数以进行分区结果吗?,sql,postgresql,Sql,Postgresql,我有一个根据特定列对数据进行分区的查询,但我现在正试图根据数据集中的四分位数对其进行分区。例如,假设我有“科技”和“零售”行业,但我将其细分为四分位,然后每个行业将有4个额外的分区 我如何合并它?我是否需要先获取四分位数,然后将其传递到下面的代码中?或者我可以直接将收入列按行划分为四分位吗 with data as ( select g.ticker, g.industry, g.countryname, g.exchang

我有一个根据特定列对数据进行分区的查询,但我现在正试图根据数据集中的四分位数对其进行分区。例如,假设我有“科技”和“零售”行业,但我将其细分为四分位,然后每个行业将有4个额外的分区

我如何合并它?我是否需要先获取四分位数,然后将其传递到下面的代码中?或者我可以直接将收入列按行划分为四分位吗

with data as (
    select
        g.ticker,
        g.industry,
        g.countryname,
        g.exchange,
        c.year,
        c.revenue,
        ROW_NUMBER() OVER (PARTITION BY g.industry ORDER BY c.revenue ASC) AS groupingNumRank,
        AVG(c.revenue) over (PARTITION BY g.industry) as industavg,
        ... and so on

我可能想尝试其他分割数据的方法(可能是以十分位数、百分比等表示),如果可能的话,我也会有兴趣学习如何分割数据。

您显然希望:

select ntile(4) over (partition by g.industry order by c.revenue) as quartile
请注意,
ntile()
确保瓷砖大小尽可能相等。这可能导致两行相同的收入在不同的分片中

如果不希望出现这种行为,可以使用
rank()
和算术:

select ceiling( rank() over (partition by g.industry order by c.revenue) * 1.0 / 
                count(*) over (partition by g.industry)
              ) as quartile

请提供样品数据和所需信息output@eshirvana我试图使它简单,我可以添加代码,但脚本是相当大的现在。简而言之,我想知道我是否可以将四分位数合并到(按g.行业划分)行中。是的,您可以,查找
ntile
函数,但是如果您希望我们帮助您进行查询,您需要提供示例数据和所需的输出非常感谢Gordon。当我在上面运行,并试图在我的部分调用它时,我得到一个错误。我在做——按g.工业划分,四分位数。I get-SQL Error[42703]:错误:列“quartile”不存在位置:1224@Lostsoul . . . 我不明白。这些是定义四分位数的表达式。用哪个更合适就用哪个。我可能解释得不对。当我在查询的分区部分中引用“quartile”时,我得到了上面的错误。为了澄清,我现在正在根据分类值(行业、国家等)进行基本分区,但我也想根据数值进行分区,因此我希望为每一行创建四分位数,并在我创建的平均值等子查询中相应地对它们进行分区。因此,简单地说,现在,我可以按行业划分公司,以获得一个行业的平均值或公司的相对位置。但是如果我想把分区进一步分解成四分位数呢。例如,对于每个行业,根据收入将公司分为4个组。因此,在本例中,对于每个行业,我最多还有4个分区(行业数*4个分区)。@Lostsoul。你的问题是关于定义四分位数。如果要使用四分位数,则需要一个子查询或CTE。