如何从另一个表中选择 MIN 和 MAX

Posted

技术标签:

【中文标题】如何从另一个表中选择 MIN 和 MAX【英文标题】:How to select MIN and MAX from another table 【发布时间】:2015-06-24 18:21:35 【问题描述】:

我在 postgresql 中有两个表:ITEM (ID, TYPE) 和 ITEM_DATA (TS, ITEM_ID) 在 1:n 关系中。第一张桌子很小,第二张桌子很大。我想知道从表ITEM_DATA 中为从表ITEM 中选择的每一行选择最小值和最大值的最佳方法。目前我有这个选择,但是太慢了:

SELECT 
  I.*,
  (SELECT MIN(ID.TS) FROM ITEM_DATA ID WHERE ID.ITEM_ID=I.ID) AS MIN_TS,
  (SELECT MAX(ID.TS) FROM ITEM_DATA ID WHERE ID.ITEM_ID=I.ID) AS MAX_TS
FROM ITEM I
WHERE I.TYPE = 'X';

表 ITEM_DATA 中有一个主键,它有两个段:TS 和 ITEM_ID,表 ITEM 上还有一个索引,它有一个段:TYPE。

有没有办法让这个查询更快?

【问题讨论】:

ITEM表有多少行,ITEM_DATA表有多少行? ITEM_DATA 上还有很多其他列吗? ITEM 有数百,ITEM_DATA 有数亿 【参考方案1】:

我认为您应该颠倒 ITEM_DATA 上 PK 列的顺序。

【讨论】:

【参考方案2】:
SELECT i.*, mima.mi, mima.ma
FROM item i
JOIN (
        SELECT DISTINCT item_id
        , MIN(ts) as mi
        , MAX(ts) as ma
        FROM item_data
        GROUP BY item_id
        ) mima ON mima.item_id = i.id
WHERE i.type = 'X'
        ;

而且,是的:您的查询将受益于索引

    CREATE INDEX ON item_data(item_id,ts);

【讨论】:

您的答案中缺少 I.TYPE = 'X' 很抱歉,即使索引段按照您建议的方式切换,您的解决方案也比我原来的帖子慢 5000 倍。 i.type = 'X' 限制的选择性是什么?该计划显示了什么?什么是旅游数据库调优?你有有效的统计数据吗?

以上是关于如何从另一个表中选择 MIN 和 MAX的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 MySQL 表中所有行的 MIN、MAX、AVG

如何根据从另一个表中选择的结果更新一个表中的列

如何使用第一个表中的逗号分隔值从另一个表中选择行? [复制]

从另一个表中选择具有数据计数的数据[重复]

如何在 C# 中使用 ComboBox 从另一个 DataGridView 的 sql 表中选择数据名称?

sql MIN()和MAX()允许您从表中的列中提取最小值和最大值。第1行显示MIN()示例,它选择最小值