Sql 选择最大项目数,获取排名和百分比
我有一个表,每个Sql 选择最大项目数,获取排名和百分比,sql,postgresql,greatest-n-per-group,window-functions,percentile,Sql,Postgresql,Greatest N Per Group,Window Functions,Percentile,我有一个表,每个person\u id列有多个条目。我正在存储一个分数,一个类别id,以及一个创建的列。因此,每当该人员完成指定的类别时,我都会为他们存储一条记录 现在我试着写一个查询:只使用最近为每个人创建的分数,找出有多少人的分数比我在特定类别中的分数差。我基本上是在做百分位计算。因此,为了得到总分数,我正在做: 从类别id=7的演出中选择计数(不同的人员id); 不过,我不知道如何编写第二个查询,它会找出有多少人做得比我差。这是我会使用“过分区”类型窗口功能的地方吗 select
person\u id
列有多个条目。我正在存储一个分数
,一个类别id
,以及一个创建的
列。因此,每当该人员完成指定的类别时,我都会为他们存储一条记录
现在我试着写一个查询:只使用最近为每个人创建的分数,找出有多少人的分数比我在特定类别中的分数差。我基本上是在做百分位计算。因此,为了得到总分数,我正在做:
从类别id=7的演出中选择计数(不同的人员id);
不过,我不知道如何编写第二个查询,它会找出有多少人做得比我差。这是我会使用“过分区”类型窗口功能的地方吗
select
person_id,
count(*) over() as total_person,
rank() over(order by score desc) as score_rank
from (
select distinct on (person_id) *
from score
where category_id = 7
order by person_id, created desc
) s
检查等级
,密集等级
,百分比等级
,分等级
,以及累积距离
:
distinct on
从每个人员id
返回一行。使用order by子句可以选择每一项
检查等级
,密集等级
,百分比等级
,分等级
,以及累积距离
:
distinct on
从每个人员id
返回一行。使用order by
子句,可以选择每一项。您实际要求的内容
仅使用每个人最近创建的分数
。。。翻译为:
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC;
SELECT *
, dense_rank() OVER w AS worse_than_me
, ntile(100) OVER w AS percentile
FROM (
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC
) p
WINDOW w AS (PARTITION BY category_id ORDER BY score);
不要在此处添加条件,否则会得到不同的(不正确的)结果。
有关
上不同的的详细信息:
找出有多少人在某一特定类别的得分比我差
。。。翻译为:
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC;
SELECT *
, dense_rank() OVER w AS worse_than_me
, ntile(100) OVER w AS percentile
FROM (
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC
) p
WINDOW w AS (PARTITION BY category_id ORDER BY score);
假设“更差”意味着分数更低。
是回答“有多少人?”——而不是回答“有多少不同的分数?”的rank()
ntile(100)
在同一个窗口定义中为您提供了整型的就绪百分比,100
表示在前1%中,99
表示在第二个最佳百分比中,等等
但是,ntile()
返回:
从1到参数值的整数,除以分区
尽可能平等地
这意味着,如果分区中的行数少于100行(如您所评论的),请乘以100.0/count(*)
以缩放该数字。“百分位数”并不是一个集合中满手行的最有用的统计数据,它通常用于大型集合
你没问的我
但很可能是想问:
“在该类别的所有
其他结果中,每个人在他最后完成的类别中的排名如何?”
假设(person\u id,category\u id)
的条目是唯一的,或者您还必须定义如何处理同一类别中每个人(包括自己)的多个结果
- 在子查询
中,我们提取每个人的最后一个条目(感兴趣的条目)pers
- 在子查询
中,我们得到了与所有其他条目相比的排名和百分位数rnk
使用JOIN
子句,就得到了一个没有重复列的准备好的USING
列表SELECT
(个人id、类别id)
,可以有多个条目,也会更有意义:
“获取每个类别中每个人的最新分数与同一类别中所有其他最新个人分数的比较排名。”
选择*
,w上的稠密秩()比我差
,百分位数(100)大于w
从(
在(个人识别号、类别识别号)上选择不同*
从表演中
按人员id、类别id、创建描述排序;
)p
窗口w AS(按类别划分\u id按分数排序)代码>
不清楚/模棱两可的问题会导致任意结果。解决方案的第一步是明确定义任务您实际提出的问题
仅使用每个人最近创建的分数
。。。翻译为:
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC;
SELECT *
, dense_rank() OVER w AS worse_than_me
, ntile(100) OVER w AS percentile
FROM (
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC
) p
WINDOW w AS (PARTITION BY category_id ORDER BY score);
不要在此处添加条件,否则会得到不同的(不正确的)结果。
有关
上不同的的详细信息:
找出有多少人在某一特定类别的得分比我差
。。。翻译为:
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC;
SELECT *
, dense_rank() OVER w AS worse_than_me
, ntile(100) OVER w AS percentile
FROM (
SELECT DISTINCT ON (person_id) *
FROM performances
ORDER BY person_id, created DESC
) p
WINDOW w AS (PARTITION BY category_id ORDER BY score);
假设“更差”意味着分数更低。
是回答“有多少人?”——而不是回答“有多少不同的分数?”的rank()
ntile(100)
在同一个窗口定义中为您提供了整型的就绪百分比,100
表示在前1%中,99
表示在第二个最佳百分比中,等等
但是,ntile()
返回:
从1到参数值的整数,除以分区
尽可能平等地
这意味着,如果分区中的行数少于100行(如您所评论的),请乘以100.0/count(*)
以缩放该数字。“百分位数”并不是一个集合中满手行的最有用的统计数据,它通常用于大型集合
你没问的我
但很可能是想问:
“在该类别的所有
其他结果中,每个人在他最后完成的类别中的排名如何?”
假设(person\u id,category\u id)
的条目是唯一的,或者您还必须定义如何处理同一类别中每个人(包括自己)的多个结果
- 在子查询
中,我们提取每个人的最后一个条目(感兴趣的条目)pers
- 在子查询
rnk中