有没有办法显示每个唯一标识的前两个结果?
Is there a way to display the first two results of each unique id?
我从事医疗保健工作。在 Postgres 数据库中,我们有 table 个成员 ID 和日期。我正在尝试为每个会员 ID 提取最新的两个日期。
简化样本数据:
A 1
B 1
B 2
C 1
C 5
C 7
D 1
D 2
D 3
D 4
想要的结果:
A 1
B 1
B 2
C 1
C 5
D 1
D 2
- 我强烈认为这是一项家庭作业,建议您在查看我的解决方案之前先自行研究分区,特别是 rank() 函数。
- 此外,您还没有具体说明您是如何收到您提供的初始结果的,所以我不得不假设您只是
select letter_column, number_column from my_table;
获得了结果。
因此,您真正想要的是将初始查询结果按 letter_column
和 select 每组中的前两行进行分组。 rank() 函数允许您为每一行分配一个数字,在组内计数:
select letter_column,
number_column,
rank() over (partition by letter_column order by number_column) as rank
from my_table;
因为它是一个函数,你不能在同一个查询的谓词中使用它,所以你必须围绕这个构建另一个查询,这次过滤 rank
结束的结果2:
with ranked_results as (select letter_column,
number_column,
rank() over (partition by letter_column order by number_column asc) as rank
from my_table mt)
select letter_column,
number_column
from ranked_results
where rank < 3;
这里有一个 SQLFiddle 可供使用:http://sqlfiddle.com/#!15/e90744/1/0
希望对您有所帮助!
我从事医疗保健工作。在 Postgres 数据库中,我们有 table 个成员 ID 和日期。我正在尝试为每个会员 ID 提取最新的两个日期。
简化样本数据:
A 1
B 1
B 2
C 1
C 5
C 7
D 1
D 2
D 3
D 4
想要的结果:
A 1
B 1
B 2
C 1
C 5
D 1
D 2
- 我强烈认为这是一项家庭作业,建议您在查看我的解决方案之前先自行研究分区,特别是 rank() 函数。
- 此外,您还没有具体说明您是如何收到您提供的初始结果的,所以我不得不假设您只是
select letter_column, number_column from my_table;
获得了结果。
因此,您真正想要的是将初始查询结果按 letter_column
和 select 每组中的前两行进行分组。 rank() 函数允许您为每一行分配一个数字,在组内计数:
select letter_column,
number_column,
rank() over (partition by letter_column order by number_column) as rank
from my_table;
因为它是一个函数,你不能在同一个查询的谓词中使用它,所以你必须围绕这个构建另一个查询,这次过滤 rank
结束的结果2:
with ranked_results as (select letter_column,
number_column,
rank() over (partition by letter_column order by number_column asc) as rank
from my_table mt)
select letter_column,
number_column
from ranked_results
where rank < 3;
这里有一个 SQLFiddle 可供使用:http://sqlfiddle.com/#!15/e90744/1/0
希望对您有所帮助!