TSQL Второе обозначение на основе условия, но также и на другое обозначение - PullRequest
0 голосов
/ 03 сентября 2018

Попытка реализовать некоторый код, где я создаю два столбца, которые отмечают конец условия. Я начну с кода:

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

По сути, этот код работает нормально. Но я хочу, чтобы вторая конечная маркировка начиналась с предыдущей конечной маркировки столбца Endmarking. В этом примере я хотел бы, чтобы столбец SecondEndMarking изменился с 1 на 2 в строке 9, потому что тогда предыдущая маркировка была заполнена **.

Желаемый результат:

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

Это может показаться немного расплывчатым, но с указанным примером кода и желаемым выводом, я надеюсь, кто-то может мне помочь!

Спасибо.

1 Ответ

0 голосов
/ 03 сентября 2018

Если я правильно понимаю, вы можете попробовать это.

из-за 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 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...