我有一个表,我想按行分组。使用“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(不仅仅是 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)
)