首页 > 解决方案 > jpa sql获取另一列中具有唯一值的所有行的限制1

问题描述

目标是有一个 sql(或更好的 jpa)方法来获取 c2 中所有唯一条目的 c1 最高的所有行。

表A:

id | c1 | c2 | c3
1  | 9  | 3  | 1
2  | 8  | 3  | 3
3  | 7  | 2  | 4
4  | 6  | 3  | 6
5  | 5  | 2  | 3
6  | 4  | 3  | 2
7  | 3  | 2  | 1

预期结果:

1  | 9  | 3  | 1
3  | 7  | 2  | 4
SELECT c2, MAX(c1) FROM TableA GROUP BY c2;

该查询有效,但由于某种原因,当有超过 1 亿行时(不同 c2 的计数约为 3),group by 会变得非常慢。

解释 psql 输出:

 Finalize GroupAggregate  (cost=1592599.23..1592600.50 rows=5 width=16)
   Group Key: c2
   ->  Gather Merge  (cost=1592599.23..1592600.40 rows=10 width=16)
         Workers Planned: 2
         ->  Sort  (cost=1591599.21..1591599.22 rows=5 width=16)
               Sort Key: c2
               ->  Partial HashAggregate  (cost=1591599.10..1591599.15 rows=5 width=16)
                     Group Key: c2
                     ->  Parallel Seq Scan on TableA  (cost=0.00..1347845.07 rows=48750807 width=16)
 JIT:
   Functions: 7
   Options: Inlining true, Optimization true, Expressions true, Deforming true
(12 rows)

基本上所有东西都有索引。

select c2, c1 from Table A where c2=3 order by c1 desc limit 1;

这总是立即返回(因为 (c2, c1 desc) 上有一个索引)。

主要目标是具有与以下相同的输出:

SELECT a.c3 
FROM TableA a
INNER JOIN (
    SELECT c2, MAX(c1)
    FROM TableA
    GROUP BY c2
) b ON a.c2 = b.c2 AND a.c1 = b.c1;

标签: sqlpostgresqljpa

解决方案


你的问题有点难以理解,但你应该能够使用distinct on

SELECT DISTINCT ON (c2) c2, c1
FROM TableA a
ORDER BY c2, c1 DESC;

这应该使用上的索引(c2, c1 DESC)

您还可以c3在此查询(以及任何其他列)中进行选择。目前尚不清楚这对于最终版本是否足够。


推荐阅读