Выберите количество мудрых записей до предела

У меня есть таблица данных, как показано ниже, и я хочу обновить флаг столбца в соответствии с указанным ниже условием.

declare @tbl table (id int identity  ,supergroup int ,subgroup int , flag char(1)  )

Цель состоит в том, чтобы получить в общей сложности 40 лучших записей на основе супергруппы и подгруппы, например, 40 / count (отдельная подгруппа), где супергруппа = @subgroup до 40 записей. предположим, что есть 3 супергруппы, и если для супергруппы 1000 есть 3 различных подгруппы, тогда выберите 40/3 = 13 записей, а для следующей супергруппы 2000 снова есть 3 отдельные подгруппы затем выберите 13 записей из этого, для следующей супергруппы 3000, если снова будет 3 подгруппы, тогда логика 40/3 = 13 будет суммировать только 39, поэтому мне нужно 14 из последней супергруппы.

в любом случае мне нужно ровно 40 записей.

Выборочные данные и желаемые результаты действительно помогут.

Gordon Linoff 29.05.2018 19:52

Пожалуйста, прочтите это, чтобы получить несколько советов по улучшению вашего вопроса.

HABO 30.05.2018 02:43
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
45
1

Ответы 1

Если я правильно понимаю, вы можете:

select top (40) t.*
from @tbl t
order by row_number() over (partition by supergroup, subgroup order by newid());

Это приведет к циклическому выбору из супергрупп и подгрупп, возвращая по одной строке из каждой перед получением второй строки из той же группы.

Обновлено:

Если вам нужно сначала провести циклический поиск супергрупп, я думаю, это сделает это:

select top (40) t.*
from @tbl t
order by row_number() over (partition by supergroup order by subgroup, newid());

Тем не менее, это, вероятно, получить все результаты от одного subgroup. Давай попытаемся снова:

select top (40) t.*
from @tbl t
order by row_number() over (partition by supergroup order by newid()),
         row_number() over (partition by supergroup, subgroup order by newid());

Это круто. +1

paparazzo 29.05.2018 20:50

@Gordon Linoff, запрос дает 40 записей, но мне нужно включить все данные суперсекторов в соответствии с количеством подсекторов, чтобы сделать его 40, и в исключении, если они не могут сделать 40, тогда любой должен выбрать больше. Пожалуйста, предложите. Заранее спасибо.

hieko 30.05.2018 05:46

@hieko. . . Я думаю, что ревизия делает то, что вы хотите: равномерную выборку из супергрупп, а затем равномерную выборку из подгрупп.

Gordon Linoff 30.05.2018 14:37

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