如何检索 postgresql 中每列的前 3 个结果?
How to retrieve top 3 results for each column in postgresql?
我已经给出了一个问题。
table 看起来像这样..
STATE | year1 | ... | year 10
AP | 100 | ... | 120
assam | 13 | .. | 42
madhya pradesh | 214 | ... | 421
现在,我需要获得每年的前 3 个州。
我尝试了所有可能的方法。但是,我无法按列过滤结果。
您的设计有问题。枚举列几乎总是糟糕设计的标志。
现在您可以使用 unnest
逆轴旋转,然后使用 window 函数 row_number
获得每年前 3 个州:
with unpivoted as (
select state,
unnest(array[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) as year,
unnest(array[
year_1, year_2, year_3,
year_4, year_5, year_6,
year_7, year_8, year_9,
year_10
]) as value,
from your_table
)
select *
from (
select t.*,
row_number() over (
partition by year
order by value desc
) as seqnum
from unpivoted t
) t
where seqnum <= 3;
Demo
我已经给出了一个问题。
table 看起来像这样..
STATE | year1 | ... | year 10
AP | 100 | ... | 120
assam | 13 | .. | 42
madhya pradesh | 214 | ... | 421
现在,我需要获得每年的前 3 个州。
我尝试了所有可能的方法。但是,我无法按列过滤结果。
您的设计有问题。枚举列几乎总是糟糕设计的标志。
现在您可以使用 unnest
逆轴旋转,然后使用 window 函数 row_number
获得每年前 3 个州:
with unpivoted as (
select state,
unnest(array[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) as year,
unnest(array[
year_1, year_2, year_3,
year_4, year_5, year_6,
year_7, year_8, year_9,
year_10
]) as value,
from your_table
)
select *
from (
select t.*,
row_number() over (
partition by year
order by value desc
) as seqnum
from unpivoted t
) t
where seqnum <= 3;