Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择最大项目数,获取排名和百分比_Sql_Postgresql_Greatest N Per Group_Window Functions_Percentile - Fatal编程技术网

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中