Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ранжирование  [new]
assmsk
Member

Откуда:
Сообщений: 169
Добрый день! Не удалось погуглить, так как не знаю как сформулировать такой запрос в поисковик))


Например есть таблица т (dt date, name varchar(3), val varchar(1) )

2018-01-01 'aaa' 'Y'
2018-01-03 'aaa' 'N'
2018-01-04 'aaa' 'N'
2018-01-05 'aaa' 'N'
2018-01-06 'aaa' 'Y'
2018-01-07 'aaa' 'Y'
2018-01-08 'aaa' 'Y'
2018-01-09 'aaa' 'N'
2018-01-03 'bbb' 'Y'
2018-01-04 'bbb' 'Y'
2018-01-05 'bbb' 'N'
2018-01-06 'bbb' 'Y'
2018-01-07 'bbb' 'N'

Как без подзапросов пронумеровать ее таким образом:

2018-01-01 'aaa' 'Y' 1
2018-01-03 'aaa' 'N' 2
2018-01-04 'aaa' 'N' 2
2018-01-05 'aaa' 'N' 2
2018-01-06 'aaa' 'Y' 3
2018-01-07 'aaa' 'Y' 3
2018-01-08 'aaa' 'Y' 3
2018-01-09 'aaa' 'N' 4
2018-01-03 'bbb' 'Y' 1
2018-01-04 'bbb' 'Y' 1
2018-01-05 'bbb' 'N' 2
2018-01-06 'bbb' 'Y' 3
2018-01-07 'bbb' 'N' 4

Те счетчик прибавляется когда меняется val
7 мар 18, 15:24    [21243550]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Добрый Э - Эх
Guest
assmsk,

Ищи тут, на форуме: start_of_group
7 мар 18, 15:35    [21243565]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
DECLARE 
  @t TABLE (
    [date] DATE, 
    [name] VARCHAR(3),
    [val] VARCHAR(1) )
;
INSERT INTO @t
VALUES
  ( '2018-01-01', 'aaa', 'Y' ),
  ( '2018-01-03', 'aaa', 'N' ),
  ( '2018-01-04', 'aaa', 'N' ),
  ( '2018-01-05', 'aaa', 'N' ),
  ( '2018-01-06', 'aaa', 'Y' ),
  ( '2018-01-07', 'aaa', 'Y' ),
  ( '2018-01-08', 'aaa', 'Y' ),
  ( '2018-01-09', 'aaa', 'N' ),
  ( '2018-01-03', 'bbb', 'Y' ),
  ( '2018-01-04', 'bbb', 'Y' ),
  ( '2018-01-05', 'bbb', 'N' ),
  ( '2018-01-06', 'bbb', 'Y' ),
  ( '2018-01-07', 'bbb', 'N' )
;
WITH
t AS (
  SELECT
    *,
    [gr] = ROW_NUMBER() OVER ( PARTITION BY [name] ORDER BY [date] )
         - ROW_NUMBER() OVER ( PARTITION BY [name], [val] ORDER BY [date] )
  FROM
    @t
)
SELECT
  *,
  [rn] = DENSE_RANK() OVER ( PARTITION BY [name] ORDER BY [gr] )
FROM
  t
;
7 мар 18, 16:31    [21243686]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Добрый Э - Эх
Guest
assmsk,

таки решение на start_of_group (требуется MS SQL Server 2012 и выше):

DECLARE 
  @t TABLE (
    [date] DATE, 
    [name] VARCHAR(3),
    [val] VARCHAR(1) )
;
INSERT INTO @t
VALUES
  ( '2018-01-01', 'aaa', 'Y' ),
  ( '2018-01-03', 'aaa', 'N' ),
  ( '2018-01-04', 'aaa', 'N' ),
  ( '2018-01-05', 'aaa', 'N' ),
  ( '2018-01-06', 'aaa', 'Y' ),
  ( '2018-01-07', 'aaa', 'Y' ),
  ( '2018-01-08', 'aaa', 'Y' ),
  ( '2018-01-09', 'aaa', 'N' ),
  ( '2018-01-03', 'bbb', 'Y' ),
  ( '2018-01-04', 'bbb', 'Y' ),
  ( '2018-01-05', 'bbb', 'N' ),
  ( '2018-01-06', 'bbb', 'Y' ),
  ( '2018-01-07', 'bbb', 'N' )
;

SELECT *
     , x_dense_rank = sum([Start_Of_Group]) over(partition by name order by date)
  FROM (
         SELECT *
              , [Start_Of_Group] = case when lag(val) over(partition by name order by date) = val then 0 else 1 end 
           FROM @t
       ) t;
7 мар 18, 17:34    [21243806]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
не взлетит, ТС не указал , что за счётчик, может он в таблице его хочет апдейтить.
а если это в запросе, то где параметры сортировки?
7 мар 18, 17:42    [21243823]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Добрый Э - Эх
Guest
Konst_One,

ты как первый день на форуме.... тут добрые 99% вопроса задаются в такой манере.
тебе, СКОРЕЕ ВСЕГО, нужно как следует "прокачивать хрустальный шар".
больше чем уверен - ТС просил именно то, что получил...

но если буйно фантазировать, то да - можно и до «Главного вопроса жизни, вселенной и всего такого» договориться...
7 мар 18, 17:55    [21243840]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить