在单个外部 SELECT 查询中使用来自 SELECT 子查询的两个聚合值

Posted

技术标签:

【中文标题】在单个外部 SELECT 查询中使用来自 SELECT 子查询的两个聚合值【英文标题】:Using two aggregate values from a SELECT subquery in a single outer SELECT query 【发布时间】:2021-02-01 07:26:54 【问题描述】:

对于相关的表和列(比以下更多),我有一个customer 表,其中包含cust_idstate 列和一个account 表,其中包含account_idcust_idavail_balance 列。

示例customer 表:

| cust_id | state |
|--------:|-------|
|       1 | MA    |
|       2 | MA    |
|       3 | MA    |
|       4 | MA    |
|       5 | NH    |
|       6 | MA    |
|       7 | MA    |
|       8 | NH    |
|       9 | MA    |
|      10 | NH    |
|      11 | MA    |
|      12 | NH    |
|      13 | MA    |

示例account 表:

| account_id | cust_id | avail_balance |
|-----------:|--------:|--------------:|
|          1 |       1 |       1057.75 |
|          2 |       1 |           500 |
|          3 |       1 |          3000 |
|          4 |       2 |       2258.02 |
|          5 |       2 |           200 |
|          7 |       3 |       1057.75 |
|          8 |       3 |        2212.5 |
|         10 |       4 |        534.12 |
|         11 |       4 |        767.77 |
|         12 |       4 |       5487.09 |
|         13 |       5 |       2237.97 |
|         14 |       6 |        122.37 |
|         15 |       6 |         10000 |
|         17 |       7 |          5000 |
|         18 |       8 |       3487.19 |
|         19 |       8 |        387.99 |
|         21 |       9 |        125.67 |
|         22 |       9 |       9345.55 |
|         23 |       9 |          1500 |
|         24 |      10 |      23575.12 |
|         25 |      10 |             0 |
|         27 |      11 |       9345.55 |
|         28 |      12 |      38552.05 |
|         29 |      13 |         50000 |

这是我希望优化的查询示例。

SELECT account.cust_id
FROM account, customer
WHERE
      account.cust_id = customer.cust_id
  AND customer.state = 'MA'
  AND customer.cust_id >
      (SELECT MAX(customer.cust_id) AS max_nh_cust_id
       FROM account, customer
       WHERE
             account.cust_id = customer.cust_id
         AND state = 'NH')
  AND account.avail_balance >
      (SELECT MAX(avail_balance) AS max_nh_avail_balance
       FROM account, customer
       WHERE
             account.cust_id = customer.cust_id
         AND state = 'NH');

上述示例数据的预期结果(如果数据不同,可能不仅仅是 1 个结果):

| cust_id |
|--------:|
|      13 |

上面的问题是代码冗余以及我们如何使用两个子查询多次遍历account 表。我希望可以使用一个子查询从account 表中获取最大值cust_idavail_balance,并在外部查询中使用这两个标量。例如,查询的形状可能如下所示:

SELECT account.cust_id
FROM account, customer
WHERE
      account.cust_id = customer.cust_id
  AND (customer.cust_id > max_nh_cust_id AND account.avail_balance) > max_nh_avail_balance) IN
      (SELECT MAX(customer.cust_id) AS max_nh_cust_id, MAX(avail_balance) AS max_nh_avail_balance
       FROM account, customer
       WHERE
             account.cust_id = customer.cust_id
         AND state = 'NH');

显然,上述方法不起作用。实现上述代码冗余较少且仅在一个查询中(可能包含子查询)的最有效方法是什么?

【问题讨论】:

请以表格文本形式提供示例数据和所需结果。目前还不清楚您要在这里做什么。 @GMB 我添加了样本数据和样本结果 @RickJames 会的。谢谢你的建议! 【参考方案1】:

您可以将 2 个子查询合并为 1 个:

SELECT MAX(c.cust_id) AS max_nh_cust_id,
       MAX(a.avail_balance) AS max_nh_avail_balance 
FROM account a INNER JOIN customer c 
ON a.cust_id = c.cust_id 
WHERE c.state = 'NH'

并像这样加入它:

SELECT a.cust_id
FROM account a 
INNER JOIN customer c ON a.cust_id = c.cust_id
INNER JOIN (
  SELECT MAX(c.cust_id) AS max_nh_cust_id,
         MAX(a.avail_balance) AS max_nh_avail_balance 
  FROM account a INNER JOIN customer c 
  ON a.cust_id = c.cust_id 
  WHERE c.state = 'NH'
) t ON c.cust_id > t.max_nh_cust_id AND a.avail_balance > t.max_nh_avail_balance
WHERE c.state = 'MA'

请参阅demo。 结果:

> | cust_id |
> | ------: |
> |      13 |

【讨论】:

嗨!我对我的问题进行了轻微调整,还询问了有关将连接列与聚合函数值一起使用的问题。如果您可以附加您对此添加的答案,我将不胜感激! 这是一个新要求,应该是一个新问题。 我明白了。会的!

以上是关于在单个外部 SELECT 查询中使用来自 SELECT 子查询的两个聚合值的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 学习之路Mysql基础知识之简单查询

在 SELECT 查询中使用集运算符

从表中的不同条件中选择COUNT

MySQL--4 查询

如何使用 Select-object 在单个查询中获取进程和线程的详细信息?

Grafana/InfluxDB:查询在面板中工作,而不是在变量中