我想要做的是获得一个行的子表,其列的行等于主表的MAX。
我用一个例子来说明:
我希望获得优先级的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;
答案 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