如何在 postgresSQL 中找到一列值的最小值和最大值并让它只返回 2 行?

问题描述 投票:0回答:1

我正在使用 postgresSQL,想找到一列中的最小值和最大值。 我必须在查询中有一个标题为“订单 ID”、“最小订单”、“最大订单”的列。 请参阅下面的代码了解我的想法。我只想返回 2 行。目前它返回 2000 行,这是整个表。

SELECT ord_id AS Order_ID
,min (order_tot) AS Minimum_Order
,max(order_tot) AS Maximum_Order
FROM orders
GROUP BY Order_ID
ORDER BY minimum_order;'
postgresql group-by max min aggregates
1个回答
0
投票

请注意,如果

order_tot
是唯一的(不太可能,对吧?),那么很容易获得一个
Order_ID
表示最小值,另一个表示最大值。但是,假设总数不唯一,尽管您可以限制行数,但您不会只得到两行。

首先,我们看一下返回最小值和最大值的

SELECT

SELECT MIN(order_tot) AS min
  FROM orders;

SELECT MAX(order_tot) AS max
  FROM orders;

这些不会为您提供相应的订单标识符,因此我们必须使用子查询来实现此目的:

SELECT Order_ID,
       order_tot AS Minimum_Order
  FROM orders
 WHERE order_tot = (SELECT MIN(order_tot) FROM orders);

SELECT Order_ID,
       order_tot AS Maximum_Order
  FROM orders
 WHERE order_tot = (SELECT MAX(order_tot) FROM orders);

您可以使用

LIMIT 1
来仅获取具有该最小值的第一个订单以及具有该最小值的第一个订单。只要知道随着时间的推移,当您使用
UPDATE
DELETE
+
INSERT
时,PostgreSQL 中的“第一顺序”就会发生变化。为了确保每次都得到相同的订单(直到删除),您必须以某种方式对这些订单进行排序。也许是
Order_ID

... ORDER BY Order_ID LIMIT 1;

如果您确实希望在单个 SQL 命令中获得两个结果,则可以使用

UNION
关键字。这可能没那么有用,并且使 SQL 比在一个查询中获取最小值然后在另一个查询中获取最大值更复杂。

所以它会变成这样:

    SELECT Order_ID,
           order_tot AS Minimum_Order
      FROM orders
     WHERE order_tot = (SELECT MIN(order_tot) FROM orders);
  ORDER BY Order_ID
     LIMIT 1
UNION
    SELECT Order_ID,
           order_tot AS Maximum_Order
      FROM orders
     WHERE order_tot = (SELECT MAX(order_tot) FROM orders)
  ORDER BY Order_ID
     LIMIT 1;
© www.soinside.com 2019 - 2024. All rights reserved.