【问题标题】:GROUP BY one field, keeping other fieldsGROUP BY 一个字段,保留其他字段
【发布时间】:2019-05-11 15:49:13
【问题描述】:

具有三个字段的基表bod

| BOFORM_ID | FEINBOD | MAECHTBOD | 
+-----------+---------+-----------+
|   3301211 | fSms    |        50 |
|   3301211 | mSfs    |       150 |
|   3301231 | fSms    |       200 |
|   3301312 | Ss      |       150 |
|   3301312 | Su2     |        50 |

我愿意

  1. BOFORM_ID分组

  2. MAECHTBOD获取最大值

  3. 同时将关联的FEINBODMAECHTBOD 的最大值保持在同一行中。

我不知道如何实现第 3 步。

我想要的输出:

| BOFORM_ID | FEINBOD | MAECHTBOD | 
+-----------+---------+-----------+
|   3301211 | mSfs    |       150 |
|   3301231 | fSms    |       200 |
|   3301312 | Ss      |       150 |

【问题讨论】:

  • 查找窗口函数(尤其是 PARTITION BY)...docs.microsoft.com/en-us/sql/t-sql/queries/…
  • @JoePhillips ... MS Access 是不同的 Microsoft 产品,使用 JET/ACE SQL 方言而不是 T-SQL。 ACE 不支持窗口函数。
  • @Parfait 确实如此。我一定是看错标签了

标签: sql ms-access group-by aggregate


【解决方案1】:

您可以使用 correlated 子查询:

SELECT b.*
FROM bod as b
WHERE MAECHTBOD = (SELECT MAX(b1.MAECHTBOD) FROM bod as b1 WHERE b1.BOFORM_ID = b.BOFORM_ID);

【讨论】:

    【解决方案2】:

    考虑将您的单元级数据加入到聚合查询中。这种方法比相关子查询更有效,相关子查询为外部查询的每一行计算聚合,而不是像下面这样一次。

    SELECT t.BOFORM_ID, t.FEINBOD, t.MAECHTBOD 
    FROM myTable t
    INNER JOIN (
       SELECT sub_t.BOFORM_ID, MAX(sub_t.MAECHTBOD) AS MAX_BOD
       FROM myTable sub_t
       GROUP BY sub_t.BOFORM_ID
    ) AS agg
    ON t.BOFORM_ID = agg.BOFORM_ID AND t.MAECHTBOD = agg.MAX_BOD
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2014-05-27
      • 2017-12-23
      • 2012-11-18
      • 2019-01-25
      相关资源
      最近更新 更多