Ранжирование на основе номера строки SQL Server 2008 R2

Я хочу сгруппировать данные моей таблицы по количеству строк. Первые 12 строк, упорядоченные по дате для каждого ProductID, получат значение = 1. Следующим 12 строкам будет присвоено значение = 2 и так далее.

Как выглядит структура таблицы:

For ProductID = 1267 are below associated dates:
02-01-2016 
03-01-2016
.
. (skipping months..table has one date per month)
.
12-01-2016
02-01-2017
.
.
.
02-01-2018

1 ответ

Решение

Использование row_number() over() с некоторой арифметикой, чтобы вычислить группы из 12, упорядоченных по дате (за продукт). Измените сортировку на ASCendng или DESCendng, чтобы удовлетворить ваши потребности.

select *
, (11 + row_number() over(partition by productid order by somedate DESC)) / 12 as rnk
from mytable
GO
myTableID | продукт | когда-нибудь | RNK
--------: |: ------------- |: ------------------ |: -
        9 | 123456 | 2018-11-12 08:24:25 | 1  
        8 | 123456 | 2018-10-02 12:29:04 | 1  
        7 | 123456 | 2018-09-09 02:39:30 | 1  
        2 | 123456 | 2018-09-02 08:49:37 | 1  
        1 | 123456 | 2018-07-04 12:25:06 | 1  
        5 | 123456 | 2018-06-06 11:38:50 | 1  
       12 | 123456 | 2018-05-23 21:12:03 | 1  
       18 | 123456 | 2018-04-02 03:59:16 | 1  
        3 | 123456 | 2018-01-02 03:42:24 | 1  
       17 | 123456 | 2017-11-29 03:19:32 | 1  
       10 | 123456 | 2017-11-10 00:45:41 | 1  
       13 | 123456 | 2017-11-05 09:53:38 | 1  
       16 | 123456 | 2017-10-20 15:39:42 | 2  
        4 | 123456 | 2017-10-14 19:25:30 | 2  
       20 | 123456 | 2017-09-21 21:31:06 | 2  
        6 | 123456 | 2017-04-06 22:10:58 | 2  
       14 | 123456 | 2017-03-24 23:35:52 | 2  
       19 | 123456 | 2017-01-22 05:07:23 | 2  
       11 | 123456 | 2016-12-13 19:17:08 | 2  
       15 | 123456 | 2016-12-02 03:22:32 | 2  

dbfiddle здесь

Другие вопросы по тегам