我有一个查询,结果如下:
A | 1
A | 2
B | 1
B | 2
B | 3
我怎样才能得到这样的结果:
A | 1
| 2
B | 1
| 2
| 3
这是一种方法:
SELECT CASE WHEN rn = 1 THEN c1 ELSE NULL END || ' | ' || c2
FROM (SELECT c1, c2, ROW_NUMBER() OVER (PARTITION BY c1 ORDER BY c2) rn
FROM your_table);
如果您使用sqlplus,可以使用
BREAK ON
:
SQL> desc tab1;
Name Null? Type
----------------------------------------- -------- ----------------------------
COL VARCHAR2(1)
COL2 NUMBER
SQL> select * from tab1;
C COL2
- ----------
A 1
A 2
B 1
B 2
B 3
SQL> break on col;
SQL> select * from tab1;
C COL2
- ----------
A 1
2
B 1
2
3
SQL>
更多详情这里。
我模糊地记得有一种方法可以在 SQL PLus 中获取这种格式。 另一种可能的方式如下:
SELECT a.COLUMN_1,
CASE
WHEN a.rnk = 1 THEN a.COLUMN_2
ELSE NULL
END AS COLUMN_2
FROM (
SELECT a.*,
RANK() OVER(PARTITION BY COLUMN_1 ORDER BY COLUMN2) rnk
FROM <YOUR_TABLE> a
) a
此表示要求最好在您用来显示结果的应用程序中满足,而不是在原始 SQL 中。您可以使用光标来满足您的要求,但这不是一个非常优雅的解决方案。
这更多的是一个格式问题,最好通过您用来显示输出的任何内容来解决。查询结果没有任何问题,作为查询结果。
在 oracle 中,查看
LEAD
和 LAG
函数。
可以查看上一行,如果与当前行相同,则将值更改为NULL。