从两个表中选择最大值、最小值

Posted

技术标签:

【中文标题】从两个表中选择最大值、最小值【英文标题】:select max, min values from two tables 【发布时间】:2011-12-14 04:37:04 【问题描述】:

我有两张桌子。不同之处在于存档是一个表,另一个保存当前记录。这些是记录公司销售额的表格。在这两个领域中,我们都有其他字段:id、name、price of sale。我需要从两个表中选择给定名称的最高和最低价格。我尝试处理查询:

select name, max (price_of_sale), min (price_of_sale)
from wapzby
union
select name, max (price_of_sale), min (price_of_sale)
from wpzby
order by name

但是这样的查询吸引了我两条记录——一条是当前表,一条是归档表。我想立即从两个表中选择最小和最大价格的名称。如何获取此查询?

【问题讨论】:

这是什么SQL引擎?在我看来,您缺少一个 GROUP BY(在每个不同的 name 周围聚合 MIN 和 MAX)和一个 WHERE 子句(仅限于一个 name)。 【参考方案1】:

这里有两个选项(符合 MSSql)

注意:UNION ALL 将组合集合而不消除重复项。这是比 UNION 简单得多的行为。

SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice
FROM
(
    SELECT Name, Price_Of_Sale
    FROM wapzby
    UNION ALL
    SELECT Name, Price_Of_Sale
    FROM wpzby
) as subQuery
GROUP BY Name
ORDER BY Name

这会在组合集合之前从每个表中计算出最大值和最小值 - 这样做可能会更高效。

SELECT Name, MAX(MaxPrice) as MaxPrice, MIN(MinPrice) as MinPrice
FROM
(
    SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice
    FROM wapzby
    GROUP BY Name
    UNION ALL
    SELECT Name, MAX(Price_Of_Sale) as MaxPrice, MIN(Price_Of_Sale) as MinPrice
    FROM wpzby
    GROUP BY Name
) as subQuery
GROUP BY Name
ORDER BY Name

【讨论】:

【参考方案2】:

在 SQL Server 中,您可以使用 subquery:

SELECT  [name],
        MAX([price_of_sale]) AS [MAX price_of_sale],
        MIN([price_of_sale]) AS [MIN price_of_sale]
FROM (
    SELECT  [name],
            [price_of_sale]
    FROM    [dbo].[wapzby]
    UNION
    SELECT  [name],
            [price_of_sale]
    FROM    [dbo].[wpzby]
) u
GROUP BY [name]
ORDER BY [name]

【讨论】:

【参考方案3】:

这更像你想要的吗?

SELECT 
    a.name,
    MAX (a.price_of_sale), 
    MIN (a.price_of_sale) ,  
    b.name, 
    MAX (b.price_of_sale), 
    MIN (b.price_of_sale) 
FROM 
    wapzby a, 
    wpzby b
ORDER BY 
    a.name 

它未经测试,但应该在一行中返回所有记录而不需要联合

【讨论】:

如果 a 中有啤酒,b 中有奶酪……他会在结果中得到关于啤酒和奶酪的一行。我不认为笛卡尔连接是他想要的。 最佳。回答。永远【参考方案4】:
SELECT MAX(value) FROM tabl1 UNION SELECT MAX(value) FROM tabl2;
SELECT MIN(value) FROM tabl1 UNION SELECT MIN(value) FROM tabl2;

【讨论】:

如果您描述该 sql 的功能并对其进行格式化以提高可读性,也许会有所帮助。 您的变体还显示 2 个值,而问题是如何获得单个最大值和单个最小值。【参考方案5】:

SELECT (SELECT MAX(value) FROM table1 WHERE trn_type='CSL' and until='TILL01') as summ, (SELECT MAX(value) FROM table2WHERE trn_type='CSL' and till='TILL01') as summ_hist

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于从两个表中选择最大值、最小值的主要内容,如果未能解决你的问题,请参考以下文章

使用java编写两个方法min和max在链表中查找最大值和最小值,但输入列表是整数数组

Oracle SQL:从组中选择最大值和最小值

cakephp 4 - 如何从相关表中查找最大值和最小值

比较两个列表并选择最大值和最小值。 (float 不是可迭代对象)

从数组浮点数中选择最小值(最低)或最大值(最大值)

是否可以通过单个查询跟踪 DynamoDB 表中的最小值/最大值?