Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Sql Server_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql 按特殊标准分组相关

Sql 按特殊标准分组相关,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,我们需要得到列需要的结果,需要按照顺序列的顺序按组列对相关数据进行分组,并且当标志列更改时,相关数据会增加 GROUP ORDER FLAG NEED 1111 1 0 1 1111 2 0 1 1111 3 1 2 1111 4 1 2 1111 5 1 2 1111 6 1 2 1111 7

我们需要得到列需要的结果,需要按照顺序列的顺序按组列对相关数据进行分组,并且当标志列更改时,相关数据会增加

GROUP   ORDER   FLAG    NEED
1111    1       0       1
1111    2       0       1
1111    3       1       2
1111    4       1       2
1111    5       1       2
1111    6       1       2
1111    7       1       2
1111    8       0       3
1111    9       1       4
1111    10      1       4
1111    11      0       5
1111    12      0       5
1111    13      0       5
6666    1       0       1
6666    2       0       1
6666    3       1       2
6666    4       1       2
我们尝试了以下代码,但是我们需要一些更干净的支持SQLServer2008的代码

if object_id('tempdb..#temp2','u') is not NULL
drop table #temp2
SELECT *
    ,ROW_NUMBER() OVER(oRDER BY (SELECT NULL)) RN
INTO #temp2
FROM DBO.PRUEBA​

SELECT T1.*
    ,SUM(CASE WHEN T1.NUM_GROUP = T2.NUM_GROUP and t1.NUM_FLAG = t2.NUM_FLAG THEN 0 ELSE 1 END) OVER (PARTITION BY T1.NUM_GROUP ORDER BY T1.rn)[Rank]
FROM #temp2 T1
LEFT JOIN #temp2 T2 ON T1.rn = T2.rn+1
order by t1.NUM_GROUP, t1.NUM_ORDER
我共享表格和记录的创建

CREATE TABLE DBO.PRUEBA
(
    NUM_GROUP INT,
    NUM_ORDER INT,
    NUM_FLAG INT
)

INSERT INTO DBO.PRUEBA VALUES (1111, 1, 0)
INSERT INTO DBO.PRUEBA VALUES (1111, 2, 0)
INSERT INTO DBO.PRUEBA VALUES (1111, 3, 1)
INSERT INTO DBO.PRUEBA VALUES (1111, 4, 1)
INSERT INTO DBO.PRUEBA VALUES (1111, 5, 1)
INSERT INTO DBO.PRUEBA VALUES (1111, 6, 1)
INSERT INTO DBO.PRUEBA VALUES (1111, 7, 1)
INSERT INTO DBO.PRUEBA VALUES (1111, 8, 0)
INSERT INTO DBO.PRUEBA VALUES (1111, 9, 1)
INSERT INTO DBO.PRUEBA VALUES (1111, 10, 1)
INSERT INTO DBO.PRUEBA VALUES (1111, 11, 0)
INSERT INTO DBO.PRUEBA VALUES (1111, 12, 0)
INSERT INTO DBO.PRUEBA VALUES (1111, 13, 0)
INSERT INTO DBO.PRUEBA VALUES (6666, 1, 0)
INSERT INTO DBO.PRUEBA VALUES (6666, 2, 0)
INSERT INTO DBO.PRUEBA VALUES (6666, 3, 1)
INSERT INTO DBO.PRUEBA VALUES (6666, 4, 1)

SELECT * FROM DBO.PRUEBA

一种可能的优化方法是首先创建临时表

不要使用
选择进入

并且主键有利于用于获取前一个NUM_标志的自连接

NUM|U组| NUM|U顺序| NUM|U标志|等级 --------: | --------: | -------: | ---: 1111 | 1 | 0 | 1 1111 | 2 | 0 | 1 1111 | 3 | 1 | 2 1111 | 4 | 1 | 2 1111 | 5 | 1 | 2 1111 | 6 | 1 | 2 1111 | 7 | 1 | 2 1111 | 8 | 0 | 3 1111 | 9 | 1 | 4 1111 | 10 | 1 | 4 1111 | 11 | 0 | 5 1111 | 12 | 0 | 5 1111 | 13 | 0 | 5 6666 | 1 | 0 | 1 6666 | 2 | 0 | 1 6666 | 3 | 1 | 2 6666 | 4 | 1 | 2
dbfiddle

一种可能的优化方法是首先创建临时表

不要使用
选择进入

并且主键有利于用于获取前一个NUM_标志的自连接

NUM|U组| NUM|U顺序| NUM|U标志|等级 --------: | --------: | -------: | ---: 1111 | 1 | 0 | 1 1111 | 2 | 0 | 1 1111 | 3 | 1 | 2 1111 | 4 | 1 | 2 1111 | 5 | 1 | 2 1111 | 6 | 1 | 2 1111 | 7 | 1 | 2 1111 | 8 | 0 | 3 1111 | 9 | 1 | 4 1111 | 10 | 1 | 4 1111 | 11 | 0 | 5 1111 | 12 | 0 | 5 1111 | 13 | 0 | 5 6666 | 1 | 0 | 1 6666 | 2 | 0 | 1 6666 | 3 | 1 | 2 6666 | 4 | 1 | 2
dbfiddle

你说的清洁剂是什么意思?查询是否提供了所需的结果?查询代码在sql server 2008中不起作用,显示的代码看起来不太干净。有什么不起作用?你说的干净是什么意思?我觉得很好。你说的清洁剂是什么意思?查询是否提供了所需的结果?查询代码在sql server 2008中不起作用,显示的代码看起来不太干净。有什么不起作用?你说的干净是什么意思?我觉得很好。
CREATE TABLE DBO.PRUEBA
(
    NUM_GROUP INT NOT NULL,
    NUM_ORDER INT NOT NULL,
    NUM_FLAG INT NOT NULL,
    PRIMARY KEY (NUM_GROUP, NUM_ORDER)
);
GO
INSERT INTO DBO.PRUEBA 
(NUM_GROUP, NUM_ORDER, NUM_FLAG)
VALUES
  (1111, 1, 0)
 ,(1111, 2, 0)
 ,(1111, 3, 1)
 ,(1111, 4, 1)
 ,(1111, 5, 1)
 ,(1111, 6, 1)
 ,(1111, 7, 1)
 ,(1111, 8, 0)
 ,(1111, 9, 1)
 ,(1111, 10, 1)
 ,(1111, 11, 0)
 ,(1111, 12, 0)
 ,(1111, 13, 0)
 ,(6666, 1, 0)
 ,(6666, 2, 0)
 ,(6666, 3, 1)
 ,(6666, 4, 1)
IF OBJECT_ID('tempdb..#tmpPRUEBA', 'U') IS NOT NULL
    DROP TABLE #tmpPRUEBA; 

CREATE TABLE #tmpPRUEBA
(
    NUM_GROUP INT NOT NULL,
    RN_GROUP INT NOT NULL,
    NUM_ORDER INT NOT NULL,
    NUM_FLAG INT NOT NULL,
    PRIMARY KEY (NUM_GROUP, RN_GROUP)
);
GO
INSERT INTO #tmpPRUEBA
(NUM_GROUP, NUM_ORDER, NUM_FLAG, RN_GROUP)
SELECT NUM_GROUP, NUM_ORDER, NUM_FLAG
, ROW_NUMBER() OVER (
      PARTITION BY NUM_GROUP 
      ORDER BY NUM_ORDER) AS RN_GROUP
FROM DBO.PRUEBA;
GO
SELECT 
t1.NUM_GROUP, 
t1.NUM_ORDER, 
t1.NUM_FLAG,
SUM(CASE 
    WHEN t1.NUM_FLAG = t2.NUM_FLAG 
    THEN 0 
    ELSE 1 
    END)
    OVER (PARTITION BY t1.NUM_GROUP 
          ORDER BY t1.RN_GROUP) AS [Rank]
FROM #tmpPRUEBA t1
LEFT JOIN #tmpPRUEBA t2
  ON t2.NUM_GROUP = t1.NUM_GROUP
 AND t2.RN_GROUP = t1.RN_GROUP - 1;
GO
NUM_GROUP | NUM_ORDER | NUM_FLAG | Rank --------: | --------: | -------: | ---: 1111 | 1 | 0 | 1 1111 | 2 | 0 | 1 1111 | 3 | 1 | 2 1111 | 4 | 1 | 2 1111 | 5 | 1 | 2 1111 | 6 | 1 | 2 1111 | 7 | 1 | 2 1111 | 8 | 0 | 3 1111 | 9 | 1 | 4 1111 | 10 | 1 | 4 1111 | 11 | 0 | 5 1111 | 12 | 0 | 5 1111 | 13 | 0 | 5 6666 | 1 | 0 | 1 6666 | 2 | 0 | 1 6666 | 3 | 1 | 2 6666 | 4 | 1 | 2