PostgreSQL:如何获得一个行的子表,其列的行等于主表的MAX

时间:2015-08-18 16:12:37

标签: sql sql-server postgresql

我想要做的是获得一个行的子表,其列的行等于主表的MAX。

我用一个例子来说明:

enter image description here

我希望获得优先级的ID:

  • 最低的VALUE2。

  • 如果多行具有最低的VALUE2(如示例所示),则它们与具有最高VALUE1

  • 的行不同
  • 如果有多行具有最高的VALUE1和最低的VALUE2,则它们最终会由ID最低的行区分

这就是为什么我想得到子表,因为我有3个选择过滤器。我认为这可以通过逐步选择子表来完成,但如果你有更好的想法(以提高性能),你可以建议它,我会感激:

首先,获取具有最低VALUE1的行的子表,然后从子表中获取具有最高VALUE2的子子表,然后获得具有最低ID的“子子子表”。

任何人都知道如何以最佳性能做到这一点? (事实上​​,在我的应用程序中,对此查询的响应速度非常快,因为有很多客户端。)

目前,我使用此查询实现此目的,但它的性能显然不佳:

SELECT MIN(id) INTO id FROM (       SELECT id FROM (
                SELECT id, value1, value2 FROM table WHERE value2 IN (
                        SELECT MIN(value2) FROM table       )
                ) AS reqB WHERE value1 = (

        SELECT MIN(value1) FROM (
                        SELECT id, value1, value2 FROM table WHERE value2 IN (

                SELECT MIN(value2) FROM table           )
                    ) as reqC   ) ) as reqA;

1 个答案:

答案 0 :(得分:2)

select min(id), value1, value2 
from (
select *,
dense_rank() over(order by value2 asc, value1 desc) as rn
from tablename) t
where t.rn = 1
group by value1, value2;

您可以使用dense_rank功能获取所需内容。

编辑:类似行的另一个解决方案是使用row_number函数,其中包含over子句中的所有排序条件。

select id, value1, value2 
from (
select *,
row_number() over(order by value2 asc, value1 desc, id asc) as rn
from tablename) t
where t.rn = 1