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

Откуда:
Сообщений: 34
Здравствуйте,

Помогите с построением запроса

Есть пример который возвращает следующий результат

DECLARE 
  @disp_uchet TABLE (id INT, data_v DATETIME, data_s DATETIME, org_id INT, obl_id INT)
  
INSERT INTO @disp_uchet VALUES
(1, '20150101', '20150120', 100010, 5),
(2, '20150221', '20150310', 100010, 5),
(3, '20150120', '20150220', 100020, 5),
(4, '20150311', '20150315', 100030, 6),
(4, '20150316', '20150320', 100030, 6),
(5, '20150320', '20150423', 100020, 5),
(6, '20150424', NULL,       100010, 5)

SELECT 
  du.id,
  du.data_v,
  du.data_s,
  du.org_id,
  du.obl_id,
  DENSE_RANK() OVER (ORDER BY obl_id) AS index_row
FROM 
  @disp_uchet du
ORDER BY 
  du.data_v


id          data_v                  data_s                  org_id      obl_id      index_row
----------- ----------------------- ----------------------- ----------- ----------- --------------------
1           2015-01-01 00:00:00     2015-01-20 00:00:00     100010      5           1
3           2015-01-20 00:00:00     2015-02-20 00:00:00     100020      5           1
2           2015-02-21 00:00:00     2015-03-10 00:00:00     100010      5           1
4           2015-03-11 00:00:00     2015-03-15 00:00:00     100030      6           2
4           2015-03-16 00:00:00     2015-03-20 00:00:00     100030      6           2
5           2015-03-20 00:00:00     2015-04-23 00:00:00     100020      5           1
6           2015-04-24 00:00:00     NULL                    100010      5           1


Необходимо, что index_row строился следующим образом

id          data_v                  data_s                  org_id      obl_id      index_row
----------- ----------------------- ----------------------- ----------- ----------- --------------------
1           2015-01-01 00:00:00     2015-01-20 00:00:00     100010      5           1
3           2015-01-20 00:00:00     2015-02-20 00:00:00     100020      5           1
2           2015-02-21 00:00:00     2015-03-10 00:00:00     100010      5           1
4           2015-03-11 00:00:00     2015-03-15 00:00:00     100030      6           2
4           2015-03-16 00:00:00     2015-03-20 00:00:00     100030      6           2
5           2015-03-20 00:00:00     2015-04-23 00:00:00     100020      5           3
6           2015-04-24 00:00:00     NULL                    100010      5           3


то есть при изменении obl_id меняется порядковый номер
3 апр 15, 12:41    [17468824]     Ответить | Цитировать Сообщить модератору
 Re: DENSE_RANK по определенному условию  [new]
Добрый Э - Эх
Guest
AlDeveloper,

STFF grp_id
3 апр 15, 12:44    [17468853]     Ответить | Цитировать Сообщить модератору
 Re: DENSE_RANK по определенному условию  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
AlDeveloper,

Насколько я понял у вас тоже самое, что здесь

https://www.sql.ru/forum/1123656-a/kto-hochet-polomat-golovu-nad-interesnoy-zadachkoy-sql-2014

Вам нужно взять разницу двух ROW_NUMBER -- одного сквозного, другого в рамках группы повторяющихся значений. И уже эту разницу ROW_NUMBER пробить DENSE_RANK
3 апр 15, 14:48    [17469685]     Ответить | Цитировать Сообщить модератору
 Re: DENSE_RANK по определенному условию  [new]
AlDeveloper
Member

Откуда:
Сообщений: 34
Добрый Э - Эх
AlDeveloper,

STFF grp_id


Спасибо,

Разобрался, как я думаю вы уже поняли мне это поле нужно было для дальнейшей группировки

Вот что получилось

DECLARE 
  @disp_uchet TABLE (id INT, data_v DATETIME, data_s DATETIME, org_id INT, obl_id INT)
  
INSERT INTO @disp_uchet VALUES
(1, '20150101', '20150120', 100010, 5),
(2, '20150221', '20150310', 100010, 5),
(3, '20150120', '20150220', 100020, 5),
(4, '20150311', '20150315', 100030, 6),
(4, '20150316', '20150320', 100030, 6),
(5, '20150320', '20150423', 100020, 5),
(6, '20150424', NULL,       100010, 5)

 
;WITH dview AS (

  SELECT 
    du.id,
    du.data_v,
    du.data_s,
    du.org_id, 
    du.obl_id,
    ROW_NUMBER() OVER (PARTITION BY du.obl_id ORDER BY du.data_v) -
    ROW_NUMBER() OVER (ORDER BY du.data_v) as grp_id
  FROM 
    @disp_uchet du

)

SELECT 
  d.obl_id,
  MIN(d.data_v) AS data_v,
  MAX(d.data_s) AS data_s
FROM 
  dview d
GROUP BY 
  d.obl_id,
  d.grp_id
ORDER BY 
  data_v


Результат

obl_id      data_v                  data_s
----------- ----------------------- -----------------------
5           2015-01-01 00:00:00     2015-03-10 00:00:00
6           2015-03-11 00:00:00     2015-03-20 00:00:00
5           2015-03-20 00:00:00     2015-04-23 00:00:00
3 апр 15, 15:04    [17469818]     Ответить | Цитировать Сообщить модератору
 Re: DENSE_RANK по определенному условию  [new]
AlDeveloper
Member

Откуда:
Сообщений: 34
Немного подправил скрипт для значения NULL в поле data_s

  SELECT 
    du.id,
    du.data_v,
    ISNULL(du.data_s, '3000-01-01') AS data_s,
    du.org_id, 
    du.obl_id,
    ROW_NUMBER() OVER (PARTITION BY du.obl_id ORDER BY du.data_v) -
    ROW_NUMBER() OVER (ORDER BY du.data_v) as grp_id
  FROM 
    @disp_uchet du


obl_id      data_v                  data_s
----------- ----------------------- -----------------------
5           2015-01-01 00:00:00.000 2015-03-10 00:00:00.000
6           2015-03-11 00:00:00.000 2015-03-20 00:00:00.000
5           2015-03-20 00:00:00.000 3000-01-01 00:00:00.000
3 апр 15, 15:09    [17469863]     Ответить | Цитировать Сообщить модератору
 Re: DENSE_RANK по определенному условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
AlDeveloper,

двадцатого месяца не бывает! :))
3 апр 15, 15:11    [17469885]     Ответить | Цитировать Сообщить модератору
 Re: DENSE_RANK по определенному условию  [new]
AlDeveloper
Member

Откуда:
Сообщений: 34
iap
AlDeveloper,

двадцатого месяца не бывает! :))


:) это не месяц это день, SQL Server у меня при выводе в виде текста формирует формат даты ГГГГ-ММ-ДД
3 апр 15, 18:20    [17471193]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить