如何按条件分组
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_id
和 likes
组合与另一行相同,我想显示 id
的第一个实例。如果 badge_id
和 likes
组合与另一行不同,请显示其所有独特的 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
子句中过滤掉的内容。
我有以下table和下面的数据。为了简单起见,我将 shape
设为 varchar
。按 shape
列分组 不是 一个选项。只能在 select 上 select 编辑或合并形状 id
。
如果我使用下面的select语句,这正是我想要的结果。它只是缺少 id
列:
SELECT badge_id, likes
FROM table1 t1
GROUP BY badge_id, likes;
我的问题是,如果 badge_id
和 likes
组合与另一行相同,我想显示 id
的第一个实例。如果 badge_id
和 likes
组合与另一行不同,请显示其所有独特的 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
子句中过滤掉的内容。