【问题标题】:How to group by with a condition如何按条件分组
【发布时间】:2021-10-09 23:57:19
【问题描述】:

我有下面的表格和数据。为简单起见,我将shape 设为varchar。按shape 列分组是不是的选项。只能在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 小提琴:http://sqlfiddle.com/#!4/83e12

【问题讨论】:

    标签: sql oracle select oracle11g


    【解决方案1】:

    听起来您想使用分析函数。类似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 子句中过滤掉的内容。

    【讨论】:

      【解决方案2】:

      我认为你想要的只是与众不同

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

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

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

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

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

      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
      

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

      【讨论】:

      • 所以你的例子,虽然它有效,但我需要id。我只需要检查badge_idlikes 组合是否与另一行相同。我真的不需要badge_idlikesshape,但我需要id。这是因为如果我有 ID,我可以再次使用 table1 加入此 select 语句的唯一结果,以获得徽章、喜欢和形状列
      • 所有这些努力都是因为shape 实际上是一个SDO_GEOMETRY 列,但我无法用它做任何事情,因为数据库需要很长时间来处理SDO_GEOMETRY 数据类型。这就是为什么为了简单起见,我将varchar 数据类型用于shape。我也更新了我的问题。希望它更有意义
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2021-09-16
      • 2018-12-03
      • 2021-02-03
      相关资源
      最近更新 更多