在oracle中合并多行的场景
我有一张桌子,上面摆着在oracle中合并多行的场景,oracle,Oracle,我有一张桌子,上面摆着 MY_ID(NUMBER) COL_1(NUMBER) COL_2(NUMBER) COL_3(VARCHAR2) 11 1001 NULL GT 11 NULL 1002 TG 11 NULL 1003 TG2 12 1004 NULL
MY_ID(NUMBER) COL_1(NUMBER) COL_2(NUMBER) COL_3(VARCHAR2)
11 1001 NULL GT
11 NULL 1002 TG
11 NULL 1003 TG2
12 1004 NULL GT
12 NULL 1006 TG
12 NULL 1005 TG2
我的预期结果是
MY_ID(NUMBER) COL_1(NUMBER) COL_2(NUMBER) COL_3(VARCHAR2)
11 1001 1003 TG2
12 1004 1006 TG
我可以用MAX来表示数字,但是Varchar2呢?
如何像这样组合多个行?MAX aggregate函数也可以用于varchar,请参见此示例:
SELECT my_id, max( col_1 ), max( col_2 ), max( col_3 )
FROM Table1
GROUP BY my_id;
演示:
但是,在您的问题中指出,对于记录,
12
必须返回值TG
,而不是TG2
。我猜您希望返回的不是COL_3
的最大列值,而是存在列COL2
的最大值的记录中的值。在这种情况下,您可以使用如下查询:
SELECT my_id, max( col_1 ), max( col_2 ),
max( col_3 ) KEEP (DENSE_RANK LAST ORDER BY col_2 NULLS FIRST)
FROM Table1
GROUP BY my_id;
演示:
如果您的问题需要,也可以将MAX用于VARCHAR2。但这是真的吗?同样的问题也适用于数字——为什么是最大值而不是最小值?或平均值或总和?只有你知道——因为只有你知道这一切背后的商业问题。例如,对于ID=12,为什么选择TG而不是TG2或GT?我正试图理解稠密等级。。。之后,我们将确认答案
SELECT my_id, max( col_1 ), max( col_2 ),
max( col_3 ) KEEP (DENSE_RANK LAST ORDER BY col_2 NULLS FIRST)
FROM Table1
GROUP BY my_id;
| MY_ID | MAX(COL_1) | MAX(COL_2) | MAX(COL_3)KEEP(DENSE_RANKLASTORDERBYCOL_2NULLSFIRST) |
|-------|------------|------------|------------------------------------------------------|
| 11 | 1001 | 1003 | TG2 |
| 12 | 1004 | 1006 | TG |