【问题标题】:Oracle SQL, how to select first row in a group?Oracle SQL,如何选择组中的第一行?
【发布时间】:2017-10-21 09:48:41
【问题描述】:

这是我的 SQL 小提琴:http://sqlfiddle.com/#!4/75ab7/2

基本上,我已经创建了一个表并在其中插入了一些数据。

CREATE TABLE subject (
  id INT NOT NULL,
  seq_num INT NOT NULL,
  name VARCHAR(30) NOT NULL
);

INSERT INTO subject 
  (id, seq_num, name) 
VALUES 
  (1, 1, 'sub_1_1');

INSERT INTO subject 
  (id, seq_num, name) 
VALUES 
  (2, 1, 'sub_1_2');

INSERT INTO subject 
  (id, seq_num, name) 
VALUES 
  (3, 2,'sub_2_1');

INSERT INTO subject 
  (id, seq_num, name) 
VALUES 
  (4, 2, 'sub_2_2');

INSERT INTO subject 
  (id, seq_num, name) 
VALUES 
  (5, 2, 'sub_2_3');

INSERT INTO subject 
  (id, seq_num, name) 
VALUES 
  (6, 3, 'sub_3_1');

INSERT INTO subject 
  (id, seq_num, name) 
VALUES 
  (7, 3, 'sub_3_1');

我运行这个选择语句:

select
  LISTAGG(TRIM(id), ',') WITHIN GROUP (ORDER BY 1) AS IDS,
  seq_num,
  LISTAGG(TRIM(name), ',') WITHIN GROUP (ORDER BY 1) AS NAMES
from
  subject
group by
  seq_num
order by
  seq_num asc

select语句结果:

| ids   | seq_num | names                   |
|-------|---------|-------------------------|
| 1,2   | 1       | sub_1_1,sub_1_2         |
| 3,4,5 | 2       | sub_2_1,sub_2_2,sub_2_3 |
| 6,7   | 3       | sub_3_1,sub_3_1         |

我可以生成这样的东西吗?

| ids | seq_num | names   |
|-----|---------|---------|
| 1   | 1       | sub_1_1 |
| 3   | 2       | sub_2_1 |
| 6   | 3       | sub_3_1 |

即只选择组中的第一行。

【问题讨论】:

    标签: sql oracle11g greatest-n-per-group


    【解决方案1】:

    使用行号:

    select
        id, seq_num, name
    from
    (
        select id, seq_num, name,
            row_number() over (partition by seq_num order by id) rn
        from subject
    ) t
    where rn = 1
    order by seq_num;
    

    这是您更新后的 Fiddle 的链接:

    Demo

    【讨论】:

      【解决方案2】:

      您可以在 oracle 中使用keepfirst

      select seq_num,
             max(trim(id)) keep (dense_rank first order by trim(id)) as first_id,
             max(trim(name)) keep (dense_rank first order by trim(id)) as first_name
      from subject
      group by seq_num
      order by seq_num asc;
      

      Here 是 SQL Fiddle。

      【讨论】:

      • 你能解释一下这里使用 Trim() 的意义吗?
      • @Harshil 。 . .这是 OP 的一个问题,应该在这个问题上提出。问题中的代码中使用了trim()
      【解决方案3】:

      这应该可行:

      select
        min(id) AS IDS,
        seq_num,
        min(name) AS NAMES
      from
        subject
      group by
        seq_num
      order by
        seq_num asc;
      

      Working Demo

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2011-11-12
        • 2020-07-27
        • 1970-01-01
        • 2010-12-25
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多