Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按条件递增其值的连续数字列_Sql - Fatal编程技术网

Sql 按条件递增其值的连续数字列

Sql 按条件递增其值的连续数字列,sql,Sql,是否有一种方法可以创建一个列,该列的运行编号可以在另一列中的值具有特定值时将其值增加1?例如,如果我们有 colA a c change b c b change b a . . . 那么我想要 colA colB a 1 c 1 change 2 b 2

是否有一种方法可以创建一个列,该列的运行编号可以在另一列中的值具有特定值时将其值增加1?例如,如果我们有

  colA 
    a 
    c 
change 
    b 
    c 
    b 
change 
    b 
    a 
    . 
    . 
    . 
那么我想要

colA          colB 
    a           1 
    c           1 
change          2 
    b           2 
    c           2 
    b           2 
change          3
    b           3 
    a           3 
    .           . 
    .           . 
    .           . 

您尚未指定订购方式,因此我将使用idColumn:


以下所有解决方案都假设您有一些明确的orderCriteria,您可以根据这些orderCriteria对事件进行排序

以下是使用PostgreSQL 9.4的方法: 下面是使用任何其他支持窗口功能的RDBMS的方法: 其中包括CUBRID、DB2、Firebird 3、HANA、Informix、Oracle、PostgreSQL、Redshift、SQL Server、Sybase SQL Anywhere等

SELECT
  colA,
  COUNT(CASE WHEN colA = 'change' THEN 1 END) OVER (ORDER BY orderCriteria) + 1 colB,
FROM my_table
ORDER BY orderCriteria
以下是使用任何其他RDBMS的方法:
您使用的是哪种数据库管理系统?博士后?Oracle?您使用的是哪种数据库管理系统?是否也有id列或类似列?能否请您对您遇到的问题再添加一点说明?colB=SELECT。。。是无效的标准SQL。您不能在SELECT语句中执行这样的赋值。@a_horse_with_no_name:您是对的,因为OP没有指定他或她的rdbms,我使用了t-SQL。然而,这种方法适用于任何数据库,您只需稍加修改即可。
SELECT
  colA,
  COUNT(*) FILTER (WHERE colA = 'change') OVER (ORDER BY orderCriteria) + 1 colB,
FROM my_table
ORDER BY orderCriteria
SELECT
  colA,
  COUNT(CASE WHEN colA = 'change' THEN 1 END) OVER (ORDER BY orderCriteria) + 1 colB,
FROM my_table
ORDER BY orderCriteria
SELECT
  colA,
  (SELECT COUNT(*)
   FROM my_table t2
   WHERE t2.orderCriteria <= t1.orderCriteria
   AND t2.colA = 'change') + 1 colB
FROM my_table t1
ORDER BY orderCriteria