sql - 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;
解决方案
你的问题有点难以理解,但你应该能够使用distinct on
:
SELECT DISTINCT ON (c2) c2, c1
FROM TableA a
ORDER BY c2, c1 DESC;
这应该使用上的索引(c2, c1 DESC)
。
您还可以c3
在此查询(以及任何其他列)中进行选择。目前尚不清楚这对于最终版本是否足够。
推荐阅读
- php - WordPress 中高级自定义字段值的总数
- anaconda - 蟒蛇压缩文件
- python - 为什么当 WSGIScriptAlias 同时具有 application-group 和 process-group 时 mod_wsgi 在非主线程中处理请求
- dataframe - 有没有办法将足球数据可视化为一场比赛中的时间线?
- javascript - 数据不保存到json?
- mysql - 如何在 MariaDB 中获取 15 天后的日期列表
- python - 在 ElasticSearch 中,如何获取百分比的相似度值?
- database - 是否可以在 Laravel 8 中加载与 DB::table 的一对多关系?
- php - 在 laravel 中的方法内重定向不起作用
- insert - 随机次数后未插入节点,二叉搜索树(C++)