我使用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;
答案 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
这是未经测试的,因此语法可能会关闭。