SQL 中的数据编号系列
Numbering series of data in SQL
我对 SQL SELECT 有点问题。我想在第 2 列中对相同值的连续组进行编号:
1,'a'
2,'a,
3,'b'
4,'c'
5,'a'
6,'a'
7,'e'
8,'e'
我想要的输出:
1,'a',1
2,'a,,1
3,'b',2
4,'c',3
5,'a',4
6,'a',4
7,'e',5
8,'e',5
是否可以仅使用 select 来完成?我必须在 Vertica 的 SQL 中执行此操作,它不支持对 select 中的变量进行操作,因此我不能仅在之前声明一个变量并以某种方式递增它。
您可以使用 window 函数来做到这一点。一种方法使用 lag()
,然后对值更改的时间进行累加:
select t.col1, t.col2,
sum(case when col2 = prev_col2 then 0 else 1 end) over (order by col1) as newcol
from (select t.*,
lag(col2) over (order by col1) as prev_col2
from t
) t
您可以使用 CONDITIONAL_CHANGE_EVENT()
,这非常简单。基本上,您将要触发序列增量的列作为参数发送,然后在 window 中按照您需要的方式对其进行排序。它是一个 Vertica 分析函数。
SELECT col1,
col2,
CONDITIONAL_CHANGE_EVENT(col2) OVER ( ORDER BY col1 )
FROM mytable
我对 SQL SELECT 有点问题。我想在第 2 列中对相同值的连续组进行编号:
1,'a'
2,'a,
3,'b'
4,'c'
5,'a'
6,'a'
7,'e'
8,'e'
我想要的输出:
1,'a',1
2,'a,,1
3,'b',2
4,'c',3
5,'a',4
6,'a',4
7,'e',5
8,'e',5
是否可以仅使用 select 来完成?我必须在 Vertica 的 SQL 中执行此操作,它不支持对 select 中的变量进行操作,因此我不能仅在之前声明一个变量并以某种方式递增它。
您可以使用 window 函数来做到这一点。一种方法使用 lag()
,然后对值更改的时间进行累加:
select t.col1, t.col2,
sum(case when col2 = prev_col2 then 0 else 1 end) over (order by col1) as newcol
from (select t.*,
lag(col2) over (order by col1) as prev_col2
from t
) t
您可以使用 CONDITIONAL_CHANGE_EVENT()
,这非常简单。基本上,您将要触发序列增量的列作为参数发送,然后在 window 中按照您需要的方式对其进行排序。它是一个 Vertica 分析函数。
SELECT col1,
col2,
CONDITIONAL_CHANGE_EVENT(col2) OVER ( ORDER BY col1 )
FROM mytable