如何按条件分组

How to group by with a condition

我有以下table和下面的数据。为了简单起见,我将 shape 设为 varchar。按 shape 列分组 不是 一个选项。只能在 select 上 select 编辑或合并形状 id

如果我使用下面的select语句,这正是我想要的结果。它只是缺少 id 列:

SELECT badge_id, likes
FROM table1 t1
GROUP BY badge_id, likes;

我的问题是,如果 badge_idlikes 组合与另一行相同,我想显示 id 的第一个实例。如果 badge_idlikes 组合与另一行不同,请显示其所有独特的 id

CREATE TABLE table1 (
    
    id          NUMBER,

    badge_id    varchar(100) NOT NULL,

    likes       varchar(100) NOT NULL,

    shape        varchar(100) NOT NULL,

    PRIMARY KEY(id)
);

INSERT INTO table1 (id, badge_id, likes, shape) VALUES
(1, 'B001', 'red, blue', 'Rectangle');
INSERT INTO table1 (id, badge_id, likes, shape) VALUES
(2, 'B001', 'red, blue', 'Rectangle');
INSERT INTO table1 (id, badge_id, likes, shape) VALUES
(3, 'B003', 'green, red', 'Triangle');
INSERT INTO table1 (id, badge_id, likes, shape) VALUES
(4, 'B003', 'purple, red', 'Square');
INSERT INTO table1 (id, badge_id, likes, shape) VALUES
(5, 'B555', 'blue, black', 'Circle');

SQL Fiddle: http://sqlfiddle.com/#!4/83e12

我想你想要的只是 DISTINCT

select distinct
      badge_id,
      likes, 
      shape 
   from 
      table1 
   order by
      badge_id,
      likes

通过执行 DISTINCT,徽章 8001 仅返回一条记录(其中徽章和喜欢的值相同,但也为您提供了它唯一的形状。

对于您的徽章 8003,您会看到这两个条目的性质不同(红色、蓝色)与(绿色、红色)。

Badge 8555 只有一个条目,所以直接来。

现在,您没有涵盖的另一个场景。具有相同徽章等的条件,但 SHAPE 不同。在上面的查询中,它会单独显示每一个,例如

id    badge    likes      shape
 6    8765     blue, red  Triangle
 7    8765     blue, red  Square
 8    8765     blue, red  Circle
 9    8765     blue, red  Triangle
10    8765     blue, red  Circle

那么 would/should 这个显示什么...通过使用 distinct,所有 3 种组合都会显示。由于 ID 8 和 10 相同,它只会显示 1...与 ID 6 和 9 相同

听起来您想使用解析函数。像 this fiddle

SELECT *
  FROM (
        SELECT t1.*, 
               row_number() over (partition by badge_id, likes
                                      order by id) rn
          FROM table1 t1
       ) subQ
 WHERE subQ.rn = 1

partition by 表示我们希望每个不同的 badge_id, likes 集都有自己的一组行号。 order by id 表示行号应遵循 id 顺序。因此,对于 badge_id, likes 的任何组合,最低的 id 将分配行号 1。这就是我们在 where 子句中过滤掉的内容。