我需要按一列分组并显示一个数据集中的更多列

Posted

技术标签:

【中文标题】我需要按一列分组并显示一个数据集中的更多列【英文标题】:I need to group by one column and show more columns from one dataset 【发布时间】:2019-04-24 12:41:48 【问题描述】:

我有下表:

AMNT1   |  COLUMN1  |  COLUMN2  |  COLUMN3    | GROUP1
--------|-----------|-----------|-------------|--------
1.00    | COL1_ROW1 | COL2_ROW1 |   COL3_ROW1 | AAA
9.00    | COL1_ROW2 | COL2_ROW2 |   COL2_ROW2 | AAA
2.00    | COL1_ROW3 | COL2_ROW3 |   COL3_ROW3 | BBB
3.00    | COL1_ROW4 | COL2_ROW4 |   COL3_ROW4 | CCC

我想对按 GROUP1 分组的 AMNT1 求和:

SELECT GROUP1, SUM(AMNT1) FROM ND_TEST GROUP BY GROUP1;

GROUP1 | SUM(AMNT1)
-------|-----------
AAA    | 10.00
BBB    | 2.00
CCC    | 3.00

另外,我想从一行中选择 COLUMN1、COLUMN2 和 COLUMN3。所以我的输出应该是这样的:

GROUP1 | SUM(AMNT1)|  COLUMN1  |  COLUMN2  |   COLUMN3  |
-------|-----------|-----------|-----------|------------|
AAA    | 10.00     | COL1_ROW1 | COL2_ROW1 |  COL3_ROW1 |
BBB    | 2.00      | COL1_ROW3 | COL2_ROW3 |  COL3_ROW3 |   
CCC    | 3.00      | COL1_ROW4 | COL2_ROW4 |  COL3_ROW4 |

如果我在分区上使用求和,我会得到每组重复...如果我使用聚合函数,我不会从同一行得到结果... 你有什么想法吗?

谢谢!

【问题讨论】:

您显示的是“从单行”选择 - 单行不是数据集。然后 - 在组 AAA 的情况下,您要选择 哪个 行?为什么是第一行,而不是第二行? (或者当一个组中有不止一行时,您是否需要随机选择一行?) 哪一行都没有关系。唯一重要的是所有列都来自同一行... 如果其他列中的哪一行无关紧要,为什么不在每一列上使用MAX()函数? 我不会从 MAX 的同一行得到结果... 是的……就这么说吧……谢谢。 【参考方案1】:
select group1, sum_amnt1, column1, column2, column3
from   (
         select group1, sum(amnt1) over (partition by group1) as sum_amnt1, 
                column1, column2, column3,
                row_number() over (partition by group1 order by null) as rn
         from   your_table
       )
where  rn = 1
row_number() 函数中的

order by null 对应于您的说明(在评论中),即每个组中的 任何 行都可以(您不在乎哪一行)。

【讨论】:

【参考方案2】:

您可以使用窗口功能:

select nt.*
from (select nt.*, sum(AMNT1) over (partition by GROUP1) as sum,
             row_number() over (partition by GROUP1 order by AMNT1) as seq
      from ND_TEST as nt
     ) nt
where seq = 1;

【讨论】:

以上是关于我需要按一列分组并显示一个数据集中的更多列的主要内容,如果未能解决你的问题,请参考以下文章

我需要连接三个表,将结果按一列分组,并显示另一列的最大值

MySQL - 按一列分组并获得最低值

如何比较按一列分组的 SQL 中的列值?

Python Pandas:按一列分组,仅在另一列中聚合,但取相应数据

如何按一列分组并对另一列的值进行排序?

新的滚动平均值列,按一列分组并找到另一列的滚动平均值