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

Откуда:
Сообщений: 67
Всем доброго времени суток.
Небольшой примерчик:
create table #test (id int, dt datetime)

insert into #test values (1, GETDATE()-5)
insert into #test values (1, GETDATE()-4)
insert into #test values (2, GETDATE()-3)
insert into #test values (1, GETDATE()-2)
insert into #test values (3, GETDATE()-1)
insert into #test values (3, GETDATE())
	
select * 
,DENSE_RANK() OVER (ORDER BY id) AS drnk
from #test order by dt 

drop table #test

Получается:
iddtdrnk
12017-02-23 08:29:39.5901
12017-02-24 08:29:39.5901
22017-02-25 08:29:39.5902
12017-02-26 08:29:39.5901
32017-02-27 08:29:39.5903
32017-02-28 08:29:39.5903

А нужно, чтобы при каждом изменении id добавлялся номер:
iddtdrnk
12017-02-23 08:29:39.5901
12017-02-24 08:29:39.5901
22017-02-25 08:29:39.5902
12017-02-26 08:29:39.5903
32017-02-27 08:29:39.5904
32017-02-28 08:29:39.5904

Как сделать быстро без курсоров, временных таблиц, inner join и outer apply?

SQL 2008 R2
28 фев 17, 06:43    [20249338]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ранжированием  [new]
Добрый Э - Эх
Guest
brick08,

пропатчиться минимум до версии 2012...
ибо имеющиеся возможности в 2008 для решения поставленной задачи ты использовать запретил. а решить без них можно только инструментарием, появившемся с версии 2012
28 фев 17, 08:19    [20249416]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ранжированием  [new]
Massa52
Member

Откуда:
Сообщений: 388
brick08,
DECLARE @test table  (id int, dt datetime);
DECLARE @minId int = 1
insert into @test values (1, GETDATE()-5)
insert into @test values (1, GETDATE()-4)
insert into @test values (2, GETDATE()-3)
insert into @test values (1, GETDATE()-2)
insert into @test values (3, GETDATE()-1)
insert into @test values (3, GETDATE())
; 
with c as	-- предыдущий id
(select id, dt,
   (select TOP 1 id from @test AS O2
    where O2.dt < O1.dt order by dt DESC) AS previd

  from @test O1
), c1 AS      -- изменение id - инкремент    
(select c.*
       ,case when id <> previd then 1 else 0 end AS inc
from c
)
select *, 
    isnull((select SUM(inc) from c1 AS O3
    where O3.dt <= c1.dt),0) + @minId AS sInc
from c1
order by dt
28 фев 17, 08:57    [20249530]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с ранжированием  [new]
SQLPowerUser
Member

Откуда: ссылка в профиле
Сообщений: 342
Massa52,

здесь можно попроще, без доп. переменной
declare @t table  (id int, dt datetime);
insert @t values (1, getdate()-5), (1, getdate()-4), (2, getdate()-3), (1, getdate()-2), (3, getdate()-1), (3, getdate());

;with t1 as (
  select id, dt, row_number() over (order by dt) - row_number() over (partition by id order by dt) [gr]
  from @t
), t2 as (
  select *, min(dt) over(partition by id,gr) [m]
  from t1
)
select id, dt, dense_rank() over (order by m) [newRank]
from t2
order by dt
28 фев 17, 12:58    [20250608]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить