使用RANK解析函数:
SELECT t.*,
RANK() OVER ( PARTITION BY a ORDER BY b ) AS r
FROM table_name t;
或您的示例数据:
CREATE TABLE table_name ( a, b ) AS
SELECT 'c1', 'a' FROM DUAL UNION ALL
SELECT 'c1', 'b' FROM DUAL UNION ALL
SELECT 'c1', 'a' FROM DUAL UNION ALL
SELECT 'c2', 'a' FROM DUAL UNION ALL
SELECT 'c2', 'a' FROM DUAL UNION ALL
SELECT 'c2', 'b' FROM DUAL;
这个输出:
一个 |乙| R
:- | :- | -:
c1 |一个 | 1
c1 |一个 | 1
c1 |乙 | 3
c2 |一个 | 1
c2 |一个 | 1
c2 |乙 | 3
db小提琴here
更新
我只是想比较相邻的行,我不在乎有多少'a'
SQL 中的行是无序的;所以你需要另一列来存储行的顺序:
CREATE TABLE table_name ( a, b, c ) AS
SELECT 'c1', 'a', 1 FROM DUAL UNION ALL
SELECT 'c1', 'b', 2 FROM DUAL UNION ALL
SELECT 'c1', 'a', 3 FROM DUAL UNION ALL
SELECT 'c2', 'a', 1 FROM DUAL UNION ALL
SELECT 'c2', 'a', 2 FROM DUAL UNION ALL
SELECT 'c2', 'b', 3 FROM DUAL;
这将找到行的密集等级:
SELECT a,
b,
c,
SUM( has_changed ) OVER ( PARTITION BY a ORDER BY c ) AS r
FROM (
SELECT t.*,
CASE
WHEN b = LAG( b ) OVER ( PARTITION BY a ORDER BY c )
THEN 0
ELSE 1
END AS has_changed
FROM table_name t
)
ORDER BY a, c;
哪些输出:
一个 |乙| C | R
:- | :- | -: | -:
c1 |一个 | 1 | 1
c1 |乙 | 2 | 2
c1 |一个 | 3 | 3
c2 |一个 | 1 | 1
c2 |一个 | 2 | 1
c2 |乙 | 3 | 2
如果您想要(稀疏)排名,那么您可以获取先前的输出并将RANK 分析函数应用于它:
SELECT a,
b,
c,
RANK() OVER ( PARTITION BY a ORDER BY r ) AS r
FROM (
SELECT a,
b,
c,
SUM( has_changed ) OVER ( PARTITION BY a ORDER BY c ) AS r
FROM (
SELECT t.*,
CASE
WHEN b = LAG( b ) OVER ( PARTITION BY a ORDER BY c )
THEN 0
ELSE 1
END AS has_changed
FROM table_name t
)
)
ORDER BY a, c;
哪些输出:
一个 |乙| C | R
:- | :- | -: | -:
c1 |一个 | 1 | 1
c1 |乙 | 2 | 2
c1 |一个 | 3 | 3
c2 |一个 | 1 | 1
c2 |一个 | 2 | 1
c2 |乙 | 3 | 3
您也可以使用MATCH_RECOGNIZE 来比较连续的行:
SELECT a,
b,
c,
dense_rank,
RANK() OVER( PARTITION BY a ORDER BY dense_rank ) AS sparse_rank
FROM table_name
MATCH_RECOGNIZE (
PARTITION BY a
ORDER BY c
MEASURES MATCH_NUMBER() AS dense_rank
ALL ROWS PER MATCH
PATTERN (FIRST_ROW EQUAL_ROWS*)
DEFINE EQUAL_ROWS AS EQUAL_ROWS.b = PREV(EQUAL_ROWS.b)
)
哪些输出:
一个 |乙| C | DENSE_RANK | SPARSE_RANK
:- | :- | -: | ---------: | ----------:
c1 |一个 | 1 | 1 | 1
c1 |乙 | 2 | 2 | 2
c1 |一个 | 3 | 3 | 3
c2 |一个 | 1 | 1 | 1
c2 |一个 | 2 | 1 | 1
c2 |乙 | 3 | 2 | 3
db小提琴here