Как присвоить переменный номер строки на основе первичного ключа таблицы?

#sql-server #stored-procedures #sql

#sql-сервер #хранимые процедуры #sql

Вопрос:

У меня есть таблица с данными по имени Product

 ProductID  ProductName
1            ABC
2            PQR
3            XYZ
4            HJK
5            LKJ
6            MNB
...          .... 
  

в нем гораздо больше продуктов. Я хочу получить такой результат в запросе Select:

 RowNo ProductID ProductName
1      1           ABC
1      2           PQR
2      3           XYZ
2      4           HJK
1      5           LKJ
1      6           MNB
2      7           klj
2      8           hjg
  

затем 1,1, 2,2 1,1 для количества записей в таблице. Возможно ли это, и если да, то как я могу это сделать?

Ответ №1:

Это работает для вашего примера данных, который предполагает, что ProductID является непрерывным:

 SELECT
   CASE WHEN ProductID % 4 = 0 OR (ProductID 1) % 4 = 0 THEN 2 ELSE 1 END,
   ProductID,
   ProductName
FROM
   Product
  

Теперь, предполагая, что вы имеете в виду в resultset, который может иметь пробелы в ProductID

 SELECT
   CASE WHEN ContiguousProductID % 4 = 0 OR (ContiguousProductID 1) % 4 = 0 THEN 2 ELSE 1 END,
   --ContiguousProductID,
   --CASE WHEN ProductID % 4 = 0 OR (ProductID 1) % 4 = 0 THEN 2 ELSE 1 END,
   ProductID,
   ProductName
FROM
    (
    SELECT
        ROW_NUMBER() OVER (ORDER BY ProductID) AS ContiguousProductID,
        ProductName, ProductID
    FROM 
        dbo.Product
    ) P2
  

Комментарии:

1. Благодаря @ gbn я получил результат при некотором редактировании одного и того же запроса, на самом деле я хочу применить 1 к первым двум строкам, затем 2 ко вторым двум, независимо от данных.