标签: rank

获取用户在评分表中的排名

我有一个非常简单的 MySQL 表,用于保存高分。它看起来像这样:

Id     Name     Score
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。问题是:我如何获得用户排名?例如,我有一个用户NameorId并且想要获得他的排名,其中所有行都按Score.

一个例子

Id  Name    Score
1   Ida     100
2   Boo     58
3   Lala    88
4   Bash    102
5   Assem   99
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Assem的排名将是 3,因为他获得了第三高的分数。

查询应返回一行,其中包含(仅)所需的排名。

mysql rank

36
推荐指数
4
解决办法
15万
查看次数

将结果限制在前 2 个排名行

在SQL Server 2008中,我使用RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)与返回的数据集RANK。但是我每个分区有数百条记录,所以我将从等级 1、2、3......999 中获取值。但我只想RANKs在每个PARTITION.

例子:

ID   Name    Score    Subject
1    Joe      100      Math
2    Jim      99       Math
3    Tim      98       Math
4    Joe      99       History
5    Jim      100      History
6    Tim      89       History
7    Joe      80       Geography
8    Tim      100      Geography
9    Jim      99       Geography
Run Code Online (Sandbox Code Playgroud)

我希望结果是:

SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC)
FROM Table
Run Code Online (Sandbox Code Playgroud)
Subject        Name      Rank …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql window-functions rank

24
推荐指数
2
解决办法
6万
查看次数

用row_number() 和dense_rank() 解决“差距和孤岛”?

如何用解决的孤岛部分。我现在已经看过几次了,我想知道是否有人可以解释一下,dense_rank()row_number()

让我们使用这样的东西作为示例数据(示例使用 PostgreSQL),

CREATE TABLE foo
AS
  SELECT x AS id, trunc(random()*3+1) AS x
  FROM generate_series(1,50)
    AS t(x);
Run Code Online (Sandbox Code Playgroud)

这应该产生这样的东西。

 id | x 
----+---
  1 | 3
  2 | 1
  3 | 3
  4 | 3
  5 | 3
  6 | 2
  7 | 3
  8 | 2
  9 | 1
 10 | 3
...
Run Code Online (Sandbox Code Playgroud)

我们想要的是这样的...... z我们可以使用的价值在哪里GROUP BY

 id | x | grp
----+------
  1 | 3 | z
  2 | …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions gaps-and-islands rank

9
推荐指数
1
解决办法
8228
查看次数

如何在 postgres 中优化窗口查询

我有下表,大约有 175k 条记录:

    Column     |            Type             |              Modifiers
----------------+-----------------------------+-------------------------------------
 id             | uuid                        | not null default uuid_generate_v4()
 competition_id | uuid                        | not null
 user_id        | uuid                        | not null
 first_name     | character varying(255)      | not null
 last_name      | character varying(255)      | not null
 image          | character varying(255)      |
 country        | character varying(255)      |
 slug           | character varying(255)      | not null
 total_votes    | integer                     | not null default 0
 created_at     | timestamp without time zone |
 updated_at     | timestamp without time …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index-tuning window-functions rank query-performance

7
推荐指数
1
解决办法
6173
查看次数

如何获取每组最新2条记录

所以,我有类似的表:

sn color value
1  red   4
2  red   8
3  green 5
4  red   2
5  green 4
6  green 3
Run Code Online (Sandbox Code Playgroud)

现在我需要每种颜色的最新 2 行,例如:

2  red   8
4  red   2
5  green 4
6  green 3
Run Code Online (Sandbox Code Playgroud)

除了对每种颜色使用单独的查询之外,该怎么做?

谢谢

mysql greatest-n-per-group rank

6
推荐指数
1
解决办法
1万
查看次数

更智能的 ntile

使用ntile()窗口函数时,主要问题是它随意分组为大致相等的部分,而不管实际值如何。

例如使用以下查询:

select
    id,title,price,
    row_number() over(order by price) as row_number,
    rank() over(order by price) as rank,
    count(*) over(order by price) as count,
    dense_rank() over(order by price) as dense_rank,
    ntile(10) over(order by price) as decile
from paintings
order by price;
Run Code Online (Sandbox Code Playgroud)

我会得到 10 组大小大致相同的画作,很有可能以相同的价格结束在不同的箱子里。

例如:

select
    id,title,price,
    row_number() over(order by price) as row_number,
    rank() over(order by price) as rank,
    count(*) over(order by price) as count,
    dense_rank() over(order by price) as dense_rank,
    ntile(10) over(order by price) as decile
from paintings
order …
Run Code Online (Sandbox Code Playgroud)

postgresql sql-server window-functions rank

6
推荐指数
1
解决办法
537
查看次数

了解为什么 rank() over 不适合不选择重复行

我想了解为什么我有不同的结果

我有一个名为 active_transfert 的表,用于记录图像传输

user_id | image_id | created_at
--------|----------|-----------
1       |1         |2014-07-10
1       |2         |2015-01-21
2       |1         |2015-05-23
3       |1         |2016-07-22
4       |6         |2017-06-01
4       |6         |2014-08-22
Run Code Online (Sandbox Code Playgroud)

我想为每个 image_id 返回唯一的 user_id。

SELECT user_id,
       image_id
FROM active_transfert
GROUP BY user_id,
         image_id; --50


SELECT user_id,
       image_id
FROM
  (SELECT user_id,
          image_id,
          rank() OVER (PARTITION BY user_id, image_id
                       ORDER BY created_at DESC) AS i_ranked
   FROM active_transfert) AS i
WHERE i.i_ranked = 1; -- 53
Run Code Online (Sandbox Code Playgroud)

我对 Redshift 运行这些查询。为什么我的第二个查询不能防止重复记录(相同的 user_id 和 image_id)?

预期结果 :

user_id …
Run Code Online (Sandbox Code Playgroud)

window-functions redshift rank

5
推荐指数
1
解决办法
1220
查看次数

如何对数据进行分组并为每一行写入其组 ID?

我有样本数据:

CREATE TABLE #T (Name varchar(5), GroupId int NULL)
INSERT INTO #T (Name)  VALUES 
('A'),
('A'),
('A'),
('B'),
('B'),
('C'),
('D'),
('D') 

Name  GroupId
----- -----------
A     NULL
A     NULL
A     NULL
B     NULL
B     NULL
C     NULL
D     NULL
D     NULL
Run Code Online (Sandbox Code Playgroud)

如何按名称对数据进行分组,并在其后写入 groupId(顺序,可能是身份)?这就是我想要得到的:

Name  GroupId
----- -----------
A     1
A     1
A     1
B     2
B     2
C     3
D     4
D     4
Run Code Online (Sandbox Code Playgroud)

要分组的表有大约 15m 行。如何更好地做到这一点?谢谢!

t-sql sql-server-2012 rank

4
推荐指数
1
解决办法
6806
查看次数

根据其他两列添加 ID 列

我有一个查询,它返回如下输出:

 [Location] [Reference] [Year] [Int1] [Int2]
    England           1   2015     13    201
    England           1   2015     12     57
    England           1   2015      4     14
    England           2   2015     18     29
    England           2   2015     18     29
    England           1   2016     32     67
    England           1   2016     43     11
    England           2   2016     10     56
Run Code Online (Sandbox Code Playgroud)

其中 int1 和 int2 列表示有关位置的一些计算数据。我试图在报告中表示数据并意识到我可以使用表单的 ID 列:

 [ID][Location] [Reference] [Year] [Int1] [Int2]
    1   England           1   2015     13    201
    2   England           1   2015     12     57
    3   England           1   2015      4     14
    1   England           2   2015 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 cursors rank

3
推荐指数
1
解决办法
238
查看次数

PERCENT_RANK 的分布不超过 100

我正在尝试以 0-100 的比例找出查询的每个给定记录的位置。我这样使用PERCENT_RANK排名功能:

select Term, Frequency, percent_rank() over (order by Frequency desc) * 100
from Words
Run Code Online (Sandbox Code Playgroud)

但是当我查看结果时,我看到的不是从 0 开始到 100 的列,而是从 0 开始到 37.xxxx 的列。

虽然BOL没有明确提到结果分布在 0-100 的范围内,但我对这个词的理解percent让我使用了这个排名函数。

我在这里想念什么?

sql-server t-sql rank

3
推荐指数
1
解决办法
1482
查看次数

如何使用 SQL UPDATE 语句设置每组的排名?

请先参考表结构: 在此处输入图片说明

现在您可以看到有一个独特的约束,包括manager_code, archive_year and archive_day_of_year.

我需要对每个组的经理进行排名,这些组的成员具有相同的 branch_code、年份和年份。这里branch_code代表部门代码。

我试过这个: 查询以获取排名 在一组中排名结果

我可以RANK()在 SQL Server 上使用正确的等级编号,但我不知道如何使用UPDATEtable 上的语句将正确的等级设置回 rank_in_department 列open_account_by_manager_per_day

你知道如何做到这一点吗?

sql-server t-sql rank

2
推荐指数
1
解决办法
1万
查看次数