SQL窗口函数计数前10位查询postgresql redshift

时间:2016-05-29 10:40:57

标签: sql postgresql window amazon-redshift

我使用SQL,amazon redshift,但它与PostGres非常相似我告诉过。

我有一个数据库,其中包含一个包含大量问题的表格,其中包含大量答案。每当有人说出答案时,问题和答案就会重复。我想要一个查询,其中列出了对这些问题的答案计数的独特问题。但是,我只想展示最常回答的十大答案。

所以我做的是我做了以下事情。我使用窗口函数来显示答案的计数,按问题划分。我将COUNT(答案)降序排序。但是,有些问题可以给出很多很多不同的答案,因此查询会列出数百行,并为该问题提供所有答案。所以我让我的窗口成为子查询。我在子查询中执行SELECT * FROM,然后在子查询外部的WHERE子句中指定窗口/分区应小于或等于10,以显示前十个答案)。这很有用。

我现在想要显示为每个问题提供的每个答案的百分比。我可以使用percent_rank或cume_dist窗口函数来完成此操作。两者都有类似的预期效果。

但是,我还想添加一个显示累积百分比的列。它应该显示给出答案的次数与该问题的答案总数的百分比。当你向这个问题的10行下去时,百分比应该建立,以便在第十行你以1.00或100%结束。

问题如下:如果一个问题只有10个或更少的潜在答案,那就完美了。但是,如果一个问题的答案超过10个,则precent_rank或cume_dist会根据答案的总答案计算出每个答案的百分比。我可以看到这没有错,但我只想显示上面提到的前10个答案以及仅基于前10名的百分比!

任何有关如何让查询忘记其他100个答案的建议,只看我的前10名,我将不胜感激。

非常感谢你 my query

SELECT * FROM (SELECT question, answer, COUNT(answer), row_number() OVER (PARTITION BY question ORDER BY count ASC) AS ranker ,question as had_to_insert_an_alias, COUNT(answer), cume_dist() OVER (PARTITION BY had_to_insert_an_alias ORDER BY count DESC) AS percent_ranker FROM question_table WHERE date_field >= '2013-10-01' and date_field < '2013-10-30' group by question, answer) AS subquery WHERE ranker <= 10 order by question;

1 个答案:

答案 0 :(得分:0)

这样的东西?

select question, answer, count, rank, (count::decimal/total::decimal)*100.0 as percent
from (
    select question, answer, count, rank,
        sum(count) over (partition by question order by count) as total
    from (
        select question, answer, count(*) as count,
            rank() over (partition by question order by count desc) as rank
        from question_table
        where  date_field >= '2013-10-01' and date_field < '2013-10-30'
        group by question, answer
    ) q
    where rank <= 10
) t
order by question, rank

这是未经测试的,因此语法可能会关闭。