Oracle SQL,如何选择组中的第一行?

ken*_*ter 2 sql oracle11g greatest-n-per-group

这是我的 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');
Run Code Online (Sandbox Code Playgroud)

我运行这个选择语句:

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
Run Code Online (Sandbox Code Playgroud)

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         |
Run Code Online (Sandbox Code Playgroud)

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

| ids | seq_num | names   |
|-----|---------|---------|
| 1   | 1       | sub_1_1 |
| 3   | 2       | sub_2_1 |
| 6   | 3       | sub_3_1 |
Run Code Online (Sandbox Code Playgroud)

那只是选择组中的第一行。

Tim*_*sen 6

使用行号:

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;
Run Code Online (Sandbox Code Playgroud)

这是更新后的 Fiddle 的链接:

演示


Gor*_*off 5

您可以在 oracle 中使用keepand :first

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;
Run Code Online (Sandbox Code Playgroud)

是 SQL Fiddle。