Группируйте записи одинаково по 3 или n значениям с помощью SQL

Как поровну разделить запись на 3 в SQL. См. Пример ниже.

DocNos   SiteCode  SiteName   
11111    0001      Canada
11111    0002      Australia
11111    0003      China
11111    0004      Japan
11111    0005      India
11111    0006      Brazil
11111    0007      England
11111    0008      Italy

Желаемый результат

DocNos   SiteCode  SiteName     Group
11111    0001      Canada        1
11111    0002      Australia     1
11111    0003      China         1
11111    0004      Japan         2
11111    0005      India         2
11111    0006      Brazil        2
11111    0007      England       3
11111    0008      Italy         3
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Использование такой функции, как row_number, с некоторой арифметикой. Измените знаменатель в соответствии с желаемым размером группы.

select t.*,1+(row_number() over(partition by docnos order by sitecode)-1)/3 as grp
from tbl t

возвращает ли этот (row_number() over(partition by docnos order by sitecode)-1)/3 целое число, а не 1,33 1,66 ....

nikhil sugandh 14.12.2018 05:22

@nikhilsugandh. . . да. SQL Server выполняет целочисленное деление.

Gordon Linoff 14.12.2018 13:48

Я бы предложил использовать оконную функцию NTILE():

SELECT
  *,
  NTILE() OVER(ORDER BY DocNos, SiteCode, SiteName) AS Grp
FROM table;

Другой способ, используя CTE (общие табличные выражения) и ROW_NUMBER():

WITH total_rows AS (
  -- Count total rows
  SELECT COUNT(*) row_count
  FROM table
)
SELECT
  *,
  CAST(ROW_NUMBER() OVER(ORDER BY DocNos, SiteCode, SiteName) / row_count) AS INT) AS Grp
FROM table
CROSS JOIN total_rows;

Дальнейшее чтение:

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