Oracle 组按行排列

问题描述 投票:0回答:1

我有一个表,我想按行分组。使用“group by”,整个列总是被分组。

源表

身份证 哈佛商学院1
1 MU
1 S
1 S
1 S
1 T
1 T
1 深圳
1 S
1 S
1 S

愿望表

身份证 哈佛商学院1 计数
1 MU 1
1 S 3
1 T 2
1 深圳 1
1 S 3

希望你能帮我一点忙。谢谢。

sql database oracle
1个回答
0
投票

在 SQL(不仅仅是 Oracle)中,结果集是非确定性排序(无序)的,除非您使用

ORDER BY
子句。您的数据无法使行保持该特定顺序,因此您无法保证结果将按该特定顺序显示。假设您有一列可用于确定顺序:

从 Oracle 12 开始,您可以使用

MATCH_RECOGNIZE
执行逐行模式匹配:

SELECT *
FROM   source
       MATCH_RECOGNIZE(
         PARTITION BY id
         ORDER BY rn
         MEASURES
           FIRST(hbs1) AS hbs1,
           COUNT(*)    AS cnt
         PATTERN (same+)
         DEFINE same AS hbs1 = FIRST(hbs1)
       )

对于样本数据:

CREATE TABLE source (ID, HBS1, rn) AS
SELECT 1, 'MU',  1 FROM DUAL UNION ALL
SELECT 1, 'S',   2 FROM DUAL UNION ALL
SELECT 1, 'S',   3 FROM DUAL UNION ALL
SELECT 1, 'S',   4 FROM DUAL UNION ALL
SELECT 1, 'T',   5 FROM DUAL UNION ALL
SELECT 1, 'T',   6 FROM DUAL UNION ALL
SELECT 1, 'SZ',  7 FROM DUAL UNION ALL
SELECT 1, 'S',   8 FROM DUAL UNION ALL
SELECT 1, 'S',   9 FROM DUAL UNION ALL
SELECT 1, 'S',  10 FROM DUAL;

输出:

身份证号码 哈佛商学院1 碳纳米管
1 MU 1
1 S 3
1 T 2
1 深圳 1
1 S 3

如果您将已排序的结果集传递到查询中并且没有带编号的列,则可以使用以下方式生成它:

SELECT *
FROM   (SELECT id, hbs1, ROWNUM AS rn FROM source)
       MATCH_RECOGNIZE(
         PARTITION BY id
         ORDER BY rn
         MEASURES
           FIRST(hbs1) AS hbs1,
           COUNT(*)    AS cnt
         PATTERN (same+)
         DEFINE same AS hbs1 = FIRST(hbs1)
       )

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.