Sql server TSQL基于条件的第二个enmarking,但也基于其他endmarking

Sql server TSQL基于条件的第二个enmarking,但也基于其他endmarking,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,尝试实现一些代码,其中我创建了两列来标记条件的结束。我将从代码开始: CREATE TABLE #SampleT (ID INT, SomeVal VARCHAR (10)) INSERT INTO #SampleT VALUES (10, 'X') INSERT INTO #SampleT VALUES (20, 'X') INSERT INTO #SampleT VALUES (30, 'X') INSERT INTO #SampleT VALUES (40, 'Y') INSERT IN

尝试实现一些代码,其中我创建了两列来标记条件的结束。我将从代码开始:

CREATE TABLE #SampleT (ID INT, SomeVal VARCHAR (10))
INSERT INTO #SampleT VALUES (10, 'X') 
INSERT INTO #SampleT VALUES (20, 'X')
INSERT INTO #SampleT VALUES (30, 'X')
INSERT INTO #SampleT VALUES (40, 'Y')
INSERT INTO #SampleT VALUES (50, 'Y')
INSERT INTO #SampleT VALUES (60, 'Y')
INSERT INTO #SampleT VALUES (70, 'W')
INSERT INTO #SampleT VALUES (80, 'W')
INSERT INTO #SampleT VALUES (90, 'W')
INSERT INTO #SampleT VALUES (100, 'Z')
INSERT INTO #SampleT VALUES (110, 'Z')
INSERT INTO #SampleT VALUES (120, 'Z')

WITH CTE AS 

(
    SELECT ID, 
         SomeVal,
         ROW_NUMBER() OVER (ORDER BY SomeVal) AS RowNumb
    FROM #SampleT AS S
)

SELECT C.*, 
      CASE WHEN C.SomeVal <> C2.SomeVal THEN '**' ELSE '' END AS EndMarking,
      (C.RowNumb / 11) + 1 AS SecondEndMarking
FROM CTE AS C
LEFT JOIN CTE AS C2 ON C.RowNumb = C2.RowNumb - 1
ORDER BY C.RowNumb

DROP TABLE #SampleT
这听起来可能有点含糊不清,但有了示例代码和所需的输出,我希望有人能帮助我


谢谢。

如果我理解正确,你可以试试这个

由于
sql server 2008
不支持
LEAD
功能,您可以尝试使用子查询来达到LEAD功能效果

CREATE TABLE SampleT (ID INT, SomeVal VARCHAR (10))
INSERT INTO SampleT VALUES (10, 'X') 
INSERT INTO SampleT VALUES (20, 'X')
INSERT INTO SampleT VALUES (30, 'X')
INSERT INTO SampleT VALUES (40, 'Y')
INSERT INTO SampleT VALUES (50, 'Y')
INSERT INTO SampleT VALUES (60, 'Y')
INSERT INTO SampleT VALUES (70, 'W')
INSERT INTO SampleT VALUES (80, 'W')
INSERT INTO SampleT VALUES (90, 'W')
INSERT INTO SampleT VALUES (100, 'Z')
INSERT INTO SampleT VALUES (110, 'Z')
INSERT INTO SampleT VALUES (120, 'Z')
查询1

;WITH CTE AS 
(
    SELECT ID, 
         SomeVal,
         ROW_NUMBER() OVER (ORDER BY SomeVal) AS RowNumb
    FROM SampleT t1
)
SELECT *,(CASE WHEN MAX(CASE WHEN EndMarking ='**' THEN RowNumb END) OVER (ORDER BY RowNumb DESC) > RowNumb THEN 1 ELSE 2 END) SecondEndMarking
FROM (
  SELECT *,CASE WHEN ( SELECT top 1 SomeVal 
      FROM cte tt
      WHERE tt.RowNumb > t1.RowNumb
      ORDER BY SomeVal )  <> SomeVal  THEN '**'
  ELSE '' END EndMarking  
  FROM CTE t1
) t1
order by RowNumb
|  ID | SomeVal | RowNumb | EndMarking | SecondEndMarking |
|-----|---------|---------|------------|------------------|
|  70 |       W |       1 |            |                1 |
|  80 |       W |       2 |            |                1 |
|  90 |       W |       3 |         ** |                1 |
|  10 |       X |       4 |            |                1 |
|  20 |       X |       5 |            |                1 |
|  30 |       X |       6 |         ** |                1 |
|  40 |       Y |       7 |            |                1 |
|  50 |       Y |       8 |            |                1 |
|  60 |       Y |       9 |         ** |                2 |
| 100 |       Z |      10 |            |                2 |
| 110 |       Z |      11 |            |                2 |
| 120 |       Z |      12 |            |                2 |

您期望的结果是什么?@D-Shih在问号中添加了。添加a”;“before WITH-否则,它无法运行感谢您的努力,我使用的是2008,所以我不能使用lead或lag。@www.StudioSQL.nl我编辑我的答案,您可以编写子查询reach
lead
函数。谢谢,我认为带有over子句的行也会在2008年引发问题。(陈述时的情况)。我一定会测试你改进后的答案!不,不幸的是,相同的问题:Msg 11305,级别15,状态10,第90行并行数据仓库(PDW)功能未启用。
|  ID | SomeVal | RowNumb | EndMarking | SecondEndMarking |
|-----|---------|---------|------------|------------------|
|  70 |       W |       1 |            |                1 |
|  80 |       W |       2 |            |                1 |
|  90 |       W |       3 |         ** |                1 |
|  10 |       X |       4 |            |                1 |
|  20 |       X |       5 |            |                1 |
|  30 |       X |       6 |         ** |                1 |
|  40 |       Y |       7 |            |                1 |
|  50 |       Y |       8 |            |                1 |
|  60 |       Y |       9 |         ** |                2 |
| 100 |       Z |      10 |            |                2 |
| 110 |       Z |      11 |            |                2 |
| 120 |       Z |      12 |            |                2 |