sql - Oracle SQL 按多个 OR 条件进行分组

标签 sql oracle

鉴于我有下表table1

field1 field2
A      B
A      C
D      B
D      C
E      F
G      F

我正在尝试获取一个查询,该查询对我的数据进行分区并对每个分区内的成员进行排名。我希望我的查询类似于下面的查询,但我不确定如何实现 field1 OR field2 条件:

SELECT 
  field1, field2, ???? as partition, 
  RANK() OVER ( PARTITION BY field1 OR field2) as rank
FROM table1

field1 field2 partition rank
A      B      1         1
A      C      1         2
D      B      1         3
D      C      1         4
E      F      2         1
G      F      2         2

最佳答案

这确实不是一个简单/好的解决方案,但这样做可以做到:

Oracle 设置:

CREATE TABLE table_name (
  field1 VARCHAR2(10),
  field2 VARCHAR2(10)
);

INSERT INTO table_name
SELECT 'A', 'B' FROM DUAL UNION ALL
SELECT 'A', 'C' FROM DUAL UNION ALL
SELECT 'D', 'B' FROM DUAL UNION ALL
SELECT 'D', 'C' FROM DUAL UNION ALL
SELECT 'E', 'F' FROM DUAL UNION ALL
SELECT 'G', 'F' FROM DUAL;

CREATE OR REPLACE TYPE StringList AS TABLE OF VARCHAR2(50);
/

查询:

SELECT field1,
       field2,
       "partition",
       ROW_NUMBER() OVER ( PARTITION BY "partition" ORDER BY field1, field2 )
         AS "rank"
FROM   (
  SELECT field1,
         f.COLUMN_VALUE AS field2,
         DENSE_RANK() OVER ( ORDER BY partition_string ) AS "partition"
  FROM   (
    SELECT field1,
           CAST( COLLECT( field2 ORDER BY field2 ) AS StringList ) AS field2s,
           LISTAGG( field2, ',' ) WITHIN GROUP ( ORDER BY field2 )
             AS partition_string
    FROM   table_name
    GROUP BY field1
  ) t,
  TABLE( field2s ) f
);

输出:

FIELD1 FIELD2 partition  rank
------ ------ ---------- ----
A      B               1    1 
A      C               1    2 
D      B               1    3 
D      C               1    4 
E      F               2    1 
G      F               2    2 

关于sql - Oracle SQL 按多个 OR 条件进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37448042/

相关文章:

MySQL显示两个表中的列而不重复

sql - 如何在 Presto 的 varchar 字段数组中搜索文本?

oracle - 如何在 SQLPlus 或 PL/SQL 中创建菜单

database - 如何按日期列对 oracle 表进行分区?

sql - 为什么 SQL 连接选择次优查询计划?

mysql查询重复项计数和输出格式

java.sql.SQLRecoverableException : Connection has been administratively disabled by console/admin command 错误

java - ORA-04054 : database link GMAIL. COM 不存在

sql - 在 oracle 的列中添加分数约束

python - 带有 XMLField 的 Django 模型