如何在postgres中找到具有相同列的列的最大值和值?
How to find maximum and value of column with the same column in postgres?
我想在特定 province
中找到 has_sold
列的最大值。例如,在所有具有 province = Tehran
的行中,哪一行具有最多 has_sold
值?
这是我的 table:
CREATE TABLE fp_stores_data_test (
time INTEGER,
province VARCHAR(20),
city VARCHAR(20),
market_id INTEGER,
product_id INTEGER,
price INTEGER,
quantity INTEGER,
has_sold INTEGER,
PRIMARY KEY (time, city, province, market_id ,product_id)
);
我试过这个SELECT DISTINCT city, max(has_sold) FROM fp_stores_data_test GROUP BY city
,但我不确定它是否正确。
您可以使用 row_number()
尝试以下方法
select * from
(
select *, row_number() over(partition by province order by has_sold desc) as rn
from fp_stores_data_test
)A where rn=1
在 Postgres 中,我会推荐 distinct on
来解决这个最大的每组 n 问题。它通常比其他替代方案更有效。
select distinct on (province) f.*
from fp_stores_data_test f
order by province, has_sold desc
对于每个 province
,这会为您提供具有最大 has_sold
的行。如果有平局,则无论如何只返回一行(您可以添加另一个排序标准来打破平局并使结果具有确定性)。
如果您想要允许潜在的顶级关系,请改用 rank()
:
select *
from (
select f.*, rank() over(partition by province order by has_sold desc) rn
from fp_stores_data_test f
) f
where rn = 1
我想在特定 province
中找到 has_sold
列的最大值。例如,在所有具有 province = Tehran
的行中,哪一行具有最多 has_sold
值?
这是我的 table:
CREATE TABLE fp_stores_data_test (
time INTEGER,
province VARCHAR(20),
city VARCHAR(20),
market_id INTEGER,
product_id INTEGER,
price INTEGER,
quantity INTEGER,
has_sold INTEGER,
PRIMARY KEY (time, city, province, market_id ,product_id)
);
我试过这个SELECT DISTINCT city, max(has_sold) FROM fp_stores_data_test GROUP BY city
,但我不确定它是否正确。
您可以使用 row_number()
select * from
(
select *, row_number() over(partition by province order by has_sold desc) as rn
from fp_stores_data_test
)A where rn=1
在 Postgres 中,我会推荐 distinct on
来解决这个最大的每组 n 问题。它通常比其他替代方案更有效。
select distinct on (province) f.*
from fp_stores_data_test f
order by province, has_sold desc
对于每个 province
,这会为您提供具有最大 has_sold
的行。如果有平局,则无论如何只返回一行(您可以添加另一个排序标准来打破平局并使结果具有确定性)。
如果您想要允许潜在的顶级关系,请改用 rank()
:
select *
from (
select f.*, rank() over(partition by province order by has_sold desc) rn
from fp_stores_data_test f
) f
where rn = 1