我有一个非常简单的 MySQL 表,用于保存高分。它看起来像这样:
Id Name Score
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。问题是:我如何获得用户排名?例如,我有一个用户Name
orId
并且想要获得他的排名,其中所有行都按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,因为他获得了第三高的分数。
查询应返回一行,其中包含(仅)所需的排名。
在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) 如何用和解决gaps-and-islands的孤岛部分。我现在已经看过几次了,我想知道是否有人可以解释一下,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) 我有下表,大约有 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
所以,我有类似的表:
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)
除了对每种颜色使用单独的查询之外,该怎么做?
谢谢
使用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) 我想了解为什么我有不同的结果
我有一个名为 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) 我有样本数据:
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 行。如何更好地做到这一点?谢谢!
我有一个查询,它返回如下输出:
[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) 我正在尝试以 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
让我使用了这个排名函数。
我在这里想念什么?
现在您可以看到有一个独特的约束,包括manager_code, archive_year and archive_day_of_year
.
我需要对每个组的经理进行排名,这些组的成员具有相同的 branch_code、年份和年份。这里branch_code
代表部门代码。
我可以RANK()
在 SQL Server 上使用正确的等级编号,但我不知道如何使用UPDATE
table 上的语句将正确的等级设置回 rank_in_department 列open_account_by_manager_per_day
。
你知道如何做到这一点吗?
rank ×11
sql-server ×5
t-sql ×4
postgresql ×3
mysql ×2
cursors ×1
index-tuning ×1
performance ×1
redshift ×1