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

Posted

技术标签:

【中文标题】SQL窗口函数计数前10查询postgresql redshift【英文标题】:SQL window function count top 10 query postgresql redshift 【发布时间】:2016-05-29 10:40:57 【问题描述】:

我使用的是 SQL,amazon redshift,但它与我听说的 PostGres 非常相似。

我有一个数据库,其中包含一个包含很多问题和答案的表格。每次有人陈述答案时,问题和答案都会重复。我想要一个查询,它列出了独特的问题以及这些问题的答案计数。但是,我只想显示最常回答的前 10 个答案。

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

我现在想显示为每个问题提供的每个答案的百分比。我可以使用 percent_rank 或 cume_dist 窗口函数来做到这一点。两者都具有相似的预期效果。

但是,我还想添加一个显示累积百分比的列。它应该显示给出答案的次数与该问题的答案总数的百分比。当您对该问题的 10 行进行向下分析时,该百分比应逐渐增加,以便在第 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;

【问题讨论】:

它最初是 PostGreSQL 8.0.2 的一个分支,但在底层进行了大量修改。此外,您的问题非常冗长且冗长。请包含一些示例数据(或指向 SQLFiddle 的链接)、您想要的结果以及您尝试过的代码。如果一张图片值一千字,那么实际代码至少值几百字​​。 如果您提供现有查询和表定义示例,则更容易给您一个好的答案。 嗨,我附上了一张显示我的查询的屏幕截图。在我写下“非常感谢”之后,这是我上面的大问题末尾的链接 感谢所有帮助 @187213 - 请不要发布屏幕截图的链接。我不愿意从只有 1 个代表的人那里点击潜在的点击诱饵。请将代码复制并粘贴到您的问题中。编辑器中有一些按钮可帮助将部分标记为特定格式的代码。如果我们需要复制粘贴您的代码以进行测试或我们的答案,这也很有帮助。 【参考方案1】:

这样的?

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

这是未经测试的,所以语法可能是关闭的。

【讨论】:

以上是关于SQL窗口函数计数前10查询postgresql redshift的主要内容,如果未能解决你的问题,请参考以下文章

使用窗口函数确定 PostgreSQL 中的 30 天运行计数

带有“lag()”窗口函数的 PostgreSQL 更新查询

PostgreSQL 窗口函数:row_number() over (partition col order by col2)

HQL/SQL 根据计数选择前 10 条记录

带窗口函数的简单SQL查询优化

Postgresql数据库函数